""" 王思聪作为消费者 要吃热狗 生产者 负责做热狗 问题: 王思聪不清楚对方会生产多少热狗 """ from multiprocessing import Process,Queue,JoinableQueue import time,random # 生产者 def make_hot_dog(q): for i
"""
王思聪作为消费者 要吃热狗
生产者 负责做热狗
问题:
王思聪不清楚对方会生产多少热狗
"""
from multiprocessing import Process,Queue,JoinableQueue
import time,random
# 生产者
def make_hot_dog(q):
for i in range(1,6):
time.sleep(random.randint(1,3))
print("\033[46m生产者 生产了hot_dog%s\033[0m" % i)
q.put("hot_dog%s" % i)
# 消费者
def eat_hot_dog(q):
while True:
time.sleep(random.randint(1, 2))
hot_dog = q.get()
print("思聪吃了%s" % hot_dog)
q.task_done()
if __name__ == ‘__main__‘:#操作系统在创建子进程时 会把文件当做模块导出从头开始执行一遍当遇到if__name__ == ‘__main__‘会判断,此时的__name__ 为模块文件名与main不相等所以不执行,
从而避免了,操作系统不停地无线的循环开启子进程。
而且子进程只能在主进程中执行产生,需要几次创建几次,
# 共享数据的队列
q = JoinableQueue()
# 生产者
p1 = Process(target=make_hot_dog,args=(q,))#有了方法和数据(通过args=(q,)传参,只需要执行if __name__ ==‘__main__‘:上的函数方法就可以
p2 = Process(target=make_hot_dog,args=(q,))
#有了方法和数据(通过args=(q,)传参,只需要执行if __name__ ==‘__main__‘:上的函数方法就可以
p1.start() p2.start() # 消费者 c1 = Process(target=eat_hot_dog,args=(q,)) c1.daemon = True c1.start() # print("完成了吗???") #先要确定生产者已经不会再生产了 p1.join() p2.join() print("生产已经结束了...") #再确定队列中的所有数据都被处理完成 q.join() print("思聪已经全部吃完了....") # c1.terminate()(终止消费者进程) #王思聪就不需要在吃了