join
当子线程调用join时,主线程会被阻塞,当子线程结束后,主线程才能继续执行。
当队列Queue调用join时,被Queue作用的函数会 挂起,等Queue中的数据被全部取出时,被挂起的函数才能继续执行。
daemon
守护进程:当子进程被设置为守护进程时,主进程结束,不管子进程是否执行完毕,都会随着主进程的结束而结束。
代码演示
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]
'''
理解下面的循环,循环开启列表的子进程,当调用p.join()时,
主程序被挂起,循环被暂停,等待子程序执行结束后循环才能继
续执行,这个相当于串行'''
for p in p_l:
p.start()
p.join()
print('主进程')