Python多线程笔记(三),queue模块

 

尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式
即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信

 

queue模块(在python2中叫Queue)实现了各种多生产者-多消费者队列,可用于在执行的多个线程之间安全地交换信息。

 

queue模块定义了三种不同的队列类

 

Queue([maxsize])
创造一个FIFO(first-in-first-out,先进先出)队列。maxsize是队列中可以放入的项的最大数量,如果省略maxsize
参数或将它置为0,队列大小将为无穷大。

LifoQueue([maxsize])
创建一个LIFO(last-in-first-out,后进先出)队列(也叫栈)

PriorityQueue([maxsize])
创建一个优先级队列,其中项按照优先级从低到高依次排列。使用这种队列时,项应该是(priority, data)形式的元组,
其中priority是一个数字。

 

队列类的实例q具有一下方法

q.qsize()
返回队列的正确大小。因为其他线程可能正在更新队列,此方法返回的数字不完全可靠

q.empty()
如果队列为空,返回True,否则返回False

q.full()
如果队列已满,返回True,否则返回False

q.put(item[,block [,timeout]])
将item放入队列。如果可选参数block为True(默认值),调用者将被阻塞直到队列中出现可用的空闲位置为止。
否则(block为False),队列满时将引发Full异常。timeout提供可选的超时值,单位为秒。如果出现超时,将引发
Full异常

q.put_nowait(item)
等价于q.put(item, False)方法

q.get(block [,timeout])
从队列中删除一项,然后返回这个项。如果可选参数block为True(默认值),调用者将阻塞,直到队列中出现可用的
空闲闲置。否则(block为False),队列为空将引发Empty异常。timeout提供可选的超时值,单位为秒。如果出现超时
将引发Empty异常。

q.get_nowait()
等价于get(0)方法

q.task_done()
队列中数据的消费数据用来指示对于项的处理已经结束。如果使用此方法,那么队列中删除的每一项都应该调用一次。

q.join()
阻塞直到队列中的所有项均被删除和处理为止。一旦为队列中的每一项都调用了一次q.task_done()方法,此方法将会直接返回。

 

复制代码
 1 import threading  2 from queue import Queue  3  4  5 class WorkerThread(threading.Thread):  6     def __init__(self, *args, **kwargs):  7         threading.Thread.__init__(self, *args, **kwargs)  8         self.input_queue = Queue()  9 10     def send(self, item): 11         self.input_queue.put(item) 12 13     def close(self): 14         self.input_queue.put(None) 15         self.input_queue.join() 16 17     def run(self): 18         while True: 19             item = self.input_queue.get() 20             if item is None: 21                 break22             # 处理项(使用有用的工作代替)23             print(item) 24             self.input_queue.task_done() 25         # 完成,指示收到和返回了哨兵26         self.input_queue.task_done() 27         return28 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信