程序中有两类
一类负责生产数据(生产者)
一类负责处理数据(消费者)
用于平衡两者的速度差 与 程序揭开耦合
# 原理,生产者将生产的对象丢到队列里边,消费者从队列里边取出数据 import time from multiprocessing import Queue from multiprocessing import Process def producer(q): # 生产者 for i in range(5): res = '包子%s' % i time.sleep(1) # 模拟延时 print('生产者生产了:%s' % res) q.put(res) # 把生产的放进容器 def consumer(q): # 消费者 while True: res = q.get() # 从容器中取出来消费 if res is None: break time.sleep(2) # 模拟延时 print('消费者吃了%s' % res) if __name__ == '__main__': # 容器 q = Queue() # 生产者 p = Process(target=producer, args=(q,)) # 把容器传进去 # 消费者 c1 = Process(target=consumer, args=(q,)) p.start() c1.start() # 因为子进程是循环,所以会导致子禁止一直在循环 p.join() # 这样可以保证在生产者生产完后执行代码 q.put(None) # 传一个None 在消费者内取值判断,如果多个生产者就传入多个 q.put(None)
比Queue更高级,在处理主进程完毕后,子进程仍然运行的问题上
import time from multiprocessing import JoinableQueue from multiprocessing import Process def producer(q): # 生产者 for i in range(5): res = '包子%s' % i time.sleep(1) # 模拟延时 print('生产者生产了:%s' % res) q.put(res) # 把生产的放进容器 q.join() # 等待取空 def consumer(q): # 消费者 while True: res = q.get() # 从容器中取出来消费 if res is None: break time.sleep(2) # 模拟延时 print('消费者吃了%s' % res) q.task_done() # 通知有一个数据被取走 if __name__ == '__main__': # 容器 q = JoinableQueue() q.join() # 生产者 p = Process(target=producer, args=(q,)) # 把容器传进去 # 消费者 c1 = Process(target=consumer, args=(q,)) c1.daemon = True # 设置为守护进程 p.start() c1.start() p.join() # 等主进程运行完,q.join也运行完了,所以用守护进程结束掉子进程即可