原文请看:http://www.cnblogs.com/holbrook/archive/2012/03/15/2398060.html

前面介绍了互斥锁条件变量解决线程间的同步问题,并使用条件变量同步机制解决了生产者与消费者问题

让我们考虑更复杂的一种场景:产品是各不相同的。这时只记录一个数量就不够了,还需要记录每个产品的细节。很容易想到需要用一个容器将这些产品记录下来。

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

用FIFO队列实现上述生产者与消费者问题的代码如下:

 #encoding=utf-8
import threading
import time
from Queue import Queue class Producer(threading.Thread):
def run(self):
global queue
count = 0
while True:
for i in range(100):
if queue.qsize() > 1000:
pass
else:
count = count +1
msg = '生成产品'+str(count)
queue.put(msg)
print msg
time.sleep(1) class Consumer(threading.Thread):
def run(self):
global queue
while True:
for i in range(3):
if queue.qsize() < 100:
pass
else:
msg = self.name + '消费了 '+queue.get()
print msg
time.sleep(1) queue = Queue() def test():
for i in range(500):
queue.put('初始产品'+str(i))
for i in range(2):
p = Producer()
p.start()
for i in range(5):
c = Consumer()
c.start()
if __name__ == '__main__':
test()

一点说明

import Queue
myqueue = Queue.Queue(maxsize = 10)

Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

将一个值放入队列中

myqueue.put(10)

调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为
1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。

将一个值从队列中取出

myqueue.get()

调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。

python queue模块有三种队列:
1、python queue模块的FIFO队列先进先出。
2、LIFO类似于堆。即先进后出。
3、还有一种是优先级队列级别越低越先出来。

针对这三种队列分别有三个构造函数:
1、class Queue.Queue(maxsize) FIFO 
2、class Queue.LifoQueue(maxsize) LIFO 
3、class Queue.PriorityQueue(maxsize) 优先级队列

介绍一下此包中的常用方法:

Queue.qsize() 返回队列的大小 
Queue.empty() 如果队列为空,返回True,反之False 
Queue.full() 如果队列满了,返回True,反之False
Queue.full 与 maxsize 大小对应 
Queue.get([block[, timeout]])获取队列,timeout等待时间 
Queue.get_nowait() 相当Queue.get(False)
非阻塞 Queue.put(item) 写入队列,timeout等待时间 
Queue.put_nowait(item) 相当Queue.put(item, False)
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join() 实际上意味着等到队列为空,再执行别的操作

最新文章

  1. React Native开发技术周报2
  2. 03_Swift2基础之基本数据类型+相互转换
  3. UserDefault的使用,保存小数据到本地-iOS
  4. centos 下 yum 安装 nginx 平滑切换安装到 Tengine
  5. python学习笔记--Django入门一 网页显示时间
  6. Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
  7. angular : $location &amp; $state(UI router)的关系
  8. Spring之声明式事务
  9. ConstraintLayout知识记录
  10. Spring MVC 响应视图(六)
  11. VMware 15 pro虚拟机
  12. 使用 CSS3 的 box-sizing 属性设置元素大小包含 border 与 padding
  13. Ribbon Workbench 与此流程相关的流程操作未激活
  14. Azure 基础:Queue Storage
  15. 2018.10.23 bzoj1297: [SCOI2009]迷路(矩阵快速幂优化dp)
  16. 20165301 2017-2018-2 《Java程序设计》第五周学习总结
  17. Luogu1261: 服务器储存信息问题
  18. Android Gradle 构建工具(Android Gradle Build Tools)是什么?
  19. js默认事件汇总
  20. Flask---ajax(jquery)交互

热门文章

  1. window10下的solr6.1.0入门笔记之---安装部署
  2. JS学习之函数的属性和方法
  3. MongoDB入门(2)- MongoDB安装
  4. 51Nod 1080
  5. 安装显卡后蓝屏0x00000116解决办法
  6. bzoj 2733 平衡树启发式合并
  7. Django之项目搭建和配置总结(一)
  8. 【Windows使用笔记】使Onedrive同步任意文件夹
  9. Yii 1.1.17 五、分页类、关联模型、权限验证与默认页面跳转
  10. sublime Text3 === 无法输入input的问题解决办法