import threading
import time
import queue
_sentinal = object() ### 队列中的线程终止信号
class Baozi:
def __init__(self, name):
self.name = name
def produce(self, q1):
# 这个函数专门产生包子
for i in range(20):
q1.put('第{}个包子'.format(str(i)))
# 生产出包子,表明包子的id号
time.sleep(1)
# 要一秒才能造出一个包子
q1.put(_sentinal)
def package(self, q1, q2):
while True:
# 只要包子店里有包子
print('包子店的包子剩余量:'+str(q1.qsize()))
# q.qsize()是获取队列中剩余的数量
temp = q1.get()
if temp is _sentinal:
q2.put(_sentinal)
break
print('打包:'+ temp)
print('包子店的包子剩余量:'+str(q1.qsize()))
# q.get()是一个堵塞的,会等待直到获取到数据
print('------------')
q2.put(temp)
print('q2剩余量:'+str(q2.qsize()))
# q1.task_done()
time.sleep(3)
def consume(self, q2):
while True:
# 只要包子店里有包子
print('打包的包子剩余量:'+str(q2.qsize()))
# q.qsize()是获取队列中剩余的数量
temp = q2.get()
if temp is _sentinal:
q2.put(_sentinal)
break
print(f'{
self.name}吃了:'+ temp)
# q.get()是一个堵塞的,会等待直到获取到数据
print('------------')
# q2.task_done()
time.sleep(3)
if __name__ == "__main__":
'''
模拟包子店卖包子
厨房每一秒钟制造一个包子
顾客每三秒吃掉一个包子
厨房一次性最多存放100个包子
'''
q1 = queue.Queue(maxsize=100)
# 厨房一次性最多存放100个包子
q2 = queue.Queue(maxsize=20)
bz = Baozi("小明")
t1 = threading.Thread(target=bz.produce,args=(q1,))
t1.start()
t2 = threading.Thread(target=bz.package,args=(q1, q2))
t2.start()
t3 = threading.Thread(target=bz.consume,args=(q2,))
t3.start()
t3.join()
print("######################")
print("包子卖完了")
print("######################")
多线程多队列(python)
猜你喜欢
转载自blog.csdn.net/weixin_42990464/article/details/125853591
今日推荐
周排行