博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python-----Queue模块
阅读量:6115 次
发布时间:2019-06-21

本文共 2975 字,大约阅读时间需要 9 分钟。

Queue模块最常与threading模块一起构成生产-消费者模型,提供了一个适用于多线程编程的先进先出的数据结构,即队列。

 

该模块源码中包含5个类:

其中,Empty和Full是两个异常类,当队列的Queue.get(block=0)或者调用get_nowait()时,如果队列为空,则抛EmptyException异常。

   同理,当队列的Queue.put(block=0)或者调用put_nowait()时,如果队列为达到maxsize,则抛FullException异常。

其他三个类:

Queue类:典型的队列模型,FIFO先入先出。  class Queue.Queue(maxsize)     maxsize为队列长度,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻                                                                                                                塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。

LifoQueue类:继承自Queue,类似于堆栈,先入后出。  class Queue.LifoQueue(maxsize)

PriorityQueue类:继承自Queue,优先级队列,级别越低越先出来。  class Queue.PriorityQueue(maxsize)

所以,只要搞定Queue类,就基本搞定Queue模块。

 

Queue类中常用的方法:

Queue.qsize()            返回队列的大小 

Queue.empty()          如果队列为空,返回True,反之False 
Queue.full()           如果队列满了,返回True,反之False
Queue.full              与 maxsize 大小对应 

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

 

Queue.get_nowait()               相当于Queue.get(False)

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

Queue.put_nowait(item)     相当Queue.put(item, False)

Queue.task_done()           在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join()               实际上意味着等到队列为空,再执行别的操作

 

一个小的练习实例:

 

1 #coding:utf-8 2 import random, threading, time 3 import Queue 4 ''' 5 实现了一个生产线程,用于往队列中添加随机数10个, 6 实现了一个消费线程,分别消耗奇数随机数和偶数随机数 7 ''' 8  9 class producer(threading.Thread):10     def __init__(self,t_name,queue):11         threading.Thread.__init__(self,name=t_name)12         self.data = queue13     def run(self):14         for i in xrange(10):15             random_num = random.randint(1,99)16             print "%s : %s 生产了一个随机数\033[31;0m %d \033[0m放入队列中" % (time.ctime(),self.getName(),random_num)17             self.data.put(random_num)18             time.sleep(1)19         print "生产线程完成!!"20 21 22 class consumer(threading.Thread):23     def __init__(self,t_name,queue):24         threading.Thread.__init__(self,name=t_name)25         self.data = queue26     def run(self):27         while True:28             try:29                 tmp_num = self.data.get(1,5) #定义超时时间5秒30                 if tmp_num%2 == 0:31                     print "%s : %s 消耗了一个队列中的偶数随机数\033[31;0m %d \033[0m" % (time.ctime(),self.getName(),tmp_num)32                     time.sleep(2)33                 else:34                     print "%s : %s 消耗了一个队列中的奇数随机数\033[31;0m %d \033[0m" % (time.ctime(), self.getName(), tmp_num)35                     time.sleep(2)36             except:37                 print "消费线程完成!!"  #一旦到达超时时间5秒,会抛异常,break退出循环38                 break39 40 41 def main():42     queue = Queue.Queue(0)43     pro = producer('Pro', queue)44     con = consumer('Con', queue)45     pro.start()46     con.start()47     pro.join()48     con.join()49     print 'All threads complete!!!'50 51 if __name__ == '__main__':52     main()

 

转载于:https://www.cnblogs.com/webber1992/p/5971597.html

你可能感兴趣的文章
【XCode7+iOS9】http网路连接请求、MKPinAnnotationView自定义图片和BitCode相关错误--备用...
查看>>
各大公司容器云的技术栈对比
查看>>
记一次eclipse无法启动的排查过程
查看>>
【转】jmeter 进行java request测试
查看>>
读书笔记--MapReduce 适用场景 及 常见应用
查看>>
SignalR在Xamarin Android中的使用
查看>>
走过电竞之路的程序员
查看>>
Eclipse和MyEclipse使用技巧--Eclipse中使用Git-让版本管理更简单
查看>>
[转]响应式表格jQuery插件 – Responsive tables
查看>>
8个3D视觉效果的HTML5动画欣赏
查看>>
C#如何在DataGridViewCell中自定义脚本编辑器
查看>>
【linux】crontab定时命令
查看>>
Android UI优化——include、merge 、ViewStub
查看>>
Office WORD如何取消开始工作右侧栏
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Android Annotation扫盲笔记
查看>>
React 整洁代码最佳实践
查看>>