线程间使用队列来互相交换数据,数据可以是字符串 、列表 、元组等,Queue 是提供队列操作的模块,常见的队列如下:

FIFO:First In First Out 先进先出队列,也就是最先放进去的数据,会被先拿出来,可以用 Queue.Queue() 来实现
LIFO:Last In First Out 后进先出队列,也就是最先放进去的数据,会到最后才被拿出来,可以用 Queue.LifoQueue() 来实现
Priority:指定优先级队列,也就是可以指定优先拿出哪些数据,可以用 Queue.PriorityQueue() 来实现

Queue 常见用法:

queue = Queue.Queue(maxsize=200)  用于创建一个队列对象,maxsize 用于指定队列的最大长度,一条数据就是长度就是1
queue.maxsize:查看队列的最大长度
queue.queue.clear():用于清空队列里的数据
queue.empty():查看队列是否为空,如果为空返回True,否则返回False
queue.full():查看队列是否已经达到指定的最大长度,如果是则返回True,否则返回False
queue.get():从队列中返回并删除一个数据,语法为:get(self, block=True, timeout=None),block=True 表示阻塞,可选参数,也就是如果队列里面是空的,我们还从队列中 get 数据,就会被阻塞,即一直停留在 get 这个动作中,直到有数据 put 进来才会 get 得到东西。默认是 block=True,如果是 blok=False 则表示不阻塞,即如果队列是空的我们还从队列中 get 数据,那么会抛出 Empty exception 这个异常,表示队列是空的;timeout=None 可以指定阻塞的时间,如果超过这个时间同样抛出 Empty exception 异常
queue.put():往队列里放入一个数据,或者说添加一个数据,语法为:put(self, item, block=True, timeout=None),其中 item 是要添加的数据;block=True 表示阻塞,可选参数,也就是即使队列满了我们也可以往里面 put 数据,只不过会先阻塞而已,等到有数据被 get 出去才会放进去,默认是 True,如果是 False 表示不阻塞,即如果队列满了我们还往里面 put 数据,就会抛出 Full exception 这个异常,表示队列已经满了;timeout=None 可以指定阻塞的时间,如果超过这个时间同样抛出 Full exception 异常

如下例子,我们往队列里添加10个数据,然后开3个线程不断从里面取出数据:

#!/usr/bin/env python
#-*- coding:utf-8 -*- import time
import Queue
import threading class Consumer(threading.Thread): def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue def run(self):
while True:
if self.queue.empty():
break
else:
data = self.queue.get()
print(data)
time.sleep(1) if __name__ == '__main__':
queue = Queue.Queue(10)
for i in range(10):
queue.put(i) for i in range(3):
c = Consumer(queue)
c.start()
[root@localhost ~]$ python 1.py
0
1
2
3
4
5
6
7
8
9

线程间通信:Queue的更多相关文章

  1. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  2. 线程间通信的三种方式(NSThread,GCD,NSOperation)

    一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDel ...

  3. 源码分析Android Handler是如何实现线程间通信的

    源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...

  4. Android线程间通信机制——深入理解 Looper、Handler、Message

    在Android中,经常使用Handler来实现线程间通信,必然要理解Looper , Handler , Message和MessageQueue的使用和原理,下面说一下Looper , Handl ...

  5. Android中线程间通信原理分析:Looper,MessageQueue,Handler

    自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么 ...

  6. Python简单线程间通信

    本节主要举一个简单的线程间通信的例子,利用线程安全的数据结构queue.Queue保存线程间通信的内容, import queue from threading import Thread from ...

  7. iOS开发NSOperation 三:操作依赖和监听以及线程间通信

    一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation Vie ...

  8. Java多线程编程(6)--线程间通信(下)

      因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景 ...

  9. 线程间通信 GET POST

    线程间通信有三种方法:NSThread   GCD  NSOperation       进程:操作系统里面每一个app就是一个进程. 一个进程里面可以包含多个线程,并且我们每一个app里面有且仅有一 ...

  10. Java多线程编程核心技术---线程间通信(二)

    通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...

随机推荐

  1. eclipse新建tomcat server但是总是报404的解决方法

    今天在eclipse中新建了tomcat server,但是由于一些配置出了问题,导致总是出现404报错,具体情况如下 症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http:/ ...

  2. java.io.PrintWriter 中 write() 与 print() 的区别

    最终都是重写了抽象类Writer里面的write方法print方法可以将各种类型的数据转换成字符串的形式输出.重载的write方法只能输出字符.字符数组.字符串等与字符相关的数据.

  3. C#中实现Windows系统流氓监控程序

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. u-boot中网口处理--硬件部分

    1.  网口硬件方案: AT91SAM9G10 + DM9000CEP: DM9000CEP为MAC+PHY解决方案,与MCU链接通过8位或16位数据总线. 内部SRAM为16Kbyte. 2. DM ...

  5. C#操作word类文件

    最近频繁操作Word文档,写了很多word的操作代码及方法,虽然已经有很多关于word的操作类了,自己还是进行了一下整合: 1.通过模板创建新文件 2.在书签处插入值 3.插入表格 4.合并单元格 5 ...

  6. android onSaveInstance方法

    为什么需要用到Activity状态保存, 如何用 ? 1)我们希望当前的Activity中的信息不会因为Activity状态的改变,而丢失.比如横竖屏的切换,突然来了个电话. 2) 借助Activit ...

  7. archdexls主题游戏页面game-play.php有评论时,报错( ! ) Warning: printf(): Too few arguments in D:\wamp\www\wp-content\themes\arcadexls\games-play.php on line 97

    ( ! ) Warning: printf(): Too few arguments in D:\wamp\www\wp-content\themes\arcadexls\games-play.php ...

  8. WCF(二)

    摘自:http://www.cnblogs.com/yank/p/3666271.html WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK ...

  9. 【转】C# 二维码生成

    /// <summary> /// 含有QR码的描述类和包装编码和渲染 /// </summary> public class QRCodeHelper { /// <s ...

  10. 使用ffmpeg实现合并多个音频为一个音频的方法

    使用ffmpeg实现合并多个音频为一个音频的方法可以使用ffmpeg的filter功能来进行这个操作,而且效果很好amerge也可以实 使用ffmpeg实现合并多个音频为一个音频的方法 可以使用ffm ...