简介
在queue模块中实现了多生产者多消费者队列,当必须在多个线程之间安全的交换信息时,它是非常有用的,此模块中的Queue类实现了所有必需的锁定语义。这取决于Python中线程支持的可用性;
这个模块提供了三种类型的队列:
- FIFO队列:先进先出
- LIFO队列:后进先出
- 优先级队列
Queue对象
class queue.Queue(maxsize = 0 )
FIFO队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果 maxsize小于或等于零,则队列大小为无限大。
常用方法 | 描述 |
---|---|
Queue.qsize() | 返回队列的大小 |
Queue.empty() | 判断队列是否为空,如果队列为空返回True |
Queue.full() | 判断队列是否为满的,如果满了返回True |
Queue.put(item, block=True, timeout=None) | 将数据放入队列中 |
Queue.get(block = True,timeout = None ) | 从队列中取出数据 |
Queue.join() | 阻塞直到队列中的所有项目都已获取并处理完毕 |
示例代码
生产者-消费者问题的实现使用了Queue对象,以及随机生产(消费)的商品的数量,生产者和消费者独立并且并发的执行线程
参考《Python核心编程》多线程章节例程有改动。
import queue
from random import randint
import threading
import time
def writeQ(queue):
print('prodecing object for Q...')
queue.put('XXX',1)
print('size now ',queue.qsize())
def readQ(queue):
val = queue.get(1)
print('consumed object from Q ... size now ',queue.qsize())
def writer(queue):
for i in range(5):
writeQ(queue)
time.sleep(randint(1,3))
def reader(queue):
for i in range(5):
readQ(queue)
time.sleep(randint(2,5))
def main():
q = queue.Queue(32)
threads = []
for i in range(0,3):
t = threading.Thread(target = writer,args = (q,))
threads.append(t)
for i in range(0,3):
t = threading.Thread(target = reader,args = (q,) )
threads.append(t)
for i in range(len(threads)):
threads[i].start()
for i in range(len(threads)):
threads[i].join()
print('all done ')
if __name__ == '__main__':
main()
参考链接:
- 官方文档:https://docs.python.org/3.6/library/queue.html
- 《Python核心编程》