Python多线程编程之queue模块
queue简介
我们使用queue模块,是用来提供线程间通信的机制,从而让线程之间可以互相分项数据。具体而言,就是创建一个队列,让生产者(线程)在其中放入新的商品,而消费者(线程)消费这些商品。
queue模块常用属性
queue 模块的类:
Queue(maxsize=0): 创建一个先进先出队列,给定最大值,没有空间时阻塞;否则为无限队列
LifoQueue(maxsize=0):创建一个栈,给定最大值,没有空间时阻塞,否则为无限队列
PriorityQueue(maxsize=0): 创建一个优先级队列。
queue异常
Empty : 当对空队列调用get*()方法时抛出异常
Full : 当对已满的队列调用put*()方法时抛出异常
queue对象方法
qsize() :返回队列大小
empty() :确认队列是否为空
full() :确认队列是否为满
put(item,block=True,timeout=None) :将item放如队列
put_nowait(item) :和put(item, False)相同
get(block=True,timeout=None) :从队列中取得元素
get_nowait() :和get(False)相同
task_done() :用于表示队列中的某个元素已执行完成
join() :在队列中所有元素执行完毕并调用上面的task_done()型号之前,保持阻塞
生产者-消费者问题
接下来的实例,是有关生产者-消费者,使用Queue对象,以及随机生产(消费)的商品数量。生产者和消费者独立且并发执行线程。
prodcons.py
from random import randint
from time import sleep
from queue import Queue
from MyThread import MyThread
def writeQ(queue):
print('producing 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, loops):
for i in range(loops):
writeQ(queue)
sleep(randint(1,3))
def reader(queue, loops):
for i in range(loops):
readQ(queue)
sleep(randint(2,5))
funcs = [writer, reader]
nfuncs = range(len(funcs))
def main():
nloops = randint(2,5)
q = Queue(32)
threads = []
for i in nfuncs:
t = MyThread(funcs[i],(q, nloops),
funcs[i].__name__)
threads.append(t)
for i in nfuncs:
threads[i].start()
for i in nfuncs:
threads[i].join()
print('all done')
if __name__ == "__main__":
main()
执行结果如下: