之前写过一个
用python生成器实现单线程并发(做包子和吃包子)
参看https://blog.csdn.net/csdniter/article/details/90723175
现在用多线程队列再实现一下:
import time
import threading #线程模块
import queue #队列模块
q=queue.Queue(10) #创建一个队列对象,允许放10个数据,不限类型
def produce_baozi(name):
for i in range(1,11):
time.sleep(1)
print("%s的第%s个包子做好了" % (name,i))
q.put(i)
q.task_done() #线程间通信
def consume_baozi(name):
for i in range(1, 11):
q.join()
date=q.get()
time.sleep(1)
print("%s吃了第%s个包子"%(name,date))
p1=threading.Thread(target=produce_baozi,args=("p1",))
c2=threading.Thread(target=consume_baozi,args=("c2",))
c3=threading.Thread(target=consume_baozi,args=("c3",))
c1=threading.Thread(target=consume_baozi,args=("c1",))
c1.start()
c2.start()
c3.start()
p1.start()
一个输出:
p1的第1个包子做好了
p1的第2个包子做好了
c1吃了第1个包子
c2吃了第2个包子
p1的第3个包子做好了
c3吃了第3个包子
p1的第4个包子做好了
p1的第5个包子做好了
c1吃了第4个包子
p1的第6个包子做好了
c1吃了第5个包子
c1吃了第6个包子
p1的第7个包子做好了
c2吃了第7个包子
p1的第8个包子做好了
p1的第9个包子做好了
c3吃了第8个包子
p1的第10个包子做好了
c1吃了第9个包子
c2吃了第10个包子