代码演示
'''
首先,消费者函数从队列中取一次数值然后调用q.task_done()通知生产者函数,<font color="#ff0000">该元素</font>我已经取过了,直到将全部元素取出。
在生产者函数中调用q.join()时,函数被挂起,直到队列的数据被全部取走,函数才能继续执行,生产者函数执行结束后,消费者函数还在等待队列中的数据,但此时消费者函数已经没有存活的必要,所以当主进程结束时,可以将该执行消费者函数的子进程带走,设置为守护进程即可'''
import os
import time
from multiprocessing import Process, JoinableQueue
def producer0(q):
for i in range(5):
print('%s 生产了 %s' % (os.getpid(), i))
q.put(i)
q.join()
def producer1(q):
for i in range(5):
print('%s 生产了 %s' % (os.getpid(), i))
q.put(i)
q.join()
def producer2(q):
for i in range(5):
print('%s 生产了 %s' % (os.getpid(), i))
q.put(i)
q.join()
def consumer(q):
while 1:
res = q.get()
time.sleep(3)
print('%s 消费了 %s' % (os.getpid(), res))
q.task_done()
if __name__ == '__main__':
q = JoinableQueue()
p1 = Process(target=producer0, args=(q,))
p2 = Process(target=producer1, args=(q,))
p3 = Process(target=producer2, args=(q,))
p4 = Process(target=consumer, args=(q,))
p5 = Process(target=consumer, args=(q,))
p_l = [p1, p2, p3, p4, p5]
#数据取完后消费者还在等着数据加入队列,但是生产者函数已经结束了,所以消费者可以随着主进程的结束而结束,所以将消费者函数设置为守护进程。
p4.daemon = True
p5.daemon = True
for p in p_l:
p.start()
p1.join()
p2.join()
p3.join()
print('主进程')
版权声明:本文为qq_33733970原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。