from multiprocessing import Process, JoinableQueue
import time
def shop(q, shopping):
for i in range(10):
q.put('包子')
print('%s 好了 %s' % (shopping, i))
def person(q):
while True:
food = q.get()
print('客户吃了一个%s' % food)
q.task_done()
错误案例:
if __name__ == '__main__':
q = JoinableQueue()
q1 = Process(target=shop, args=(q, 'egon'))
q2 = Process(target=shop, args=(q, 'alex'))
c1 = Process(target=person, args=(q,))
q1.start()
q2.start()
c1.daemon = True
c1.start()
time.sleep(0.65)
# print(q.get_nowait()) # 这样写发现,q是空的,因为此时,进程q1,q2还没往队列中添加值,所以此时,q.join()是完成的,直接主程序完成,所以,c1 根本没来得及执行就结束了
q.join() # 说明代码的执行远远快于 进程 的创建和执行。所以,要等 进程 q1,q2 完成后,在执行q.join()
# 加上time.sleep(0.5)程序可以部分的运行正常,即 进程 q1,q2 在这段时间已经完成了一部分添加。但是可能会提前取完
# 如图所示
print('主程序')
正确案例:
if __name__ == '__main__':
q = JoinableQueue()
q1 = Process(target=shop, args=(q, 'egon'))
q2 = Process(target=shop, args=(q, 'alex'))
c1 = Process(target=person, args=(q,))
q1.start()
q2.start()
c1.daemon = True # 这里设置 进程 c1 是主程序的守护进程
c1.start()
q1.join() # 要在进程 q1 , q2 将数据添加完成后,再判断 q 是否所有数据都取出,也就是 进程 c1 是否可以结束了,
q2.join()
q.join()
print('主程序')