真正开发中不会用该方法在同一台机器上这样操作,该文章只是提供一种解决方案和思路
【用途】
程序中有两类
一类负责生产数据(生产者)
一类负责处理数据(消费者)
用于平衡两者的速度差 与 程序揭开耦合
生产者<——>列队<——>消费者
# 原理,生产者将生产的对象丢到队列里边,消费者从队列里边取出数据
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)
【另外一种列队JoinableQueue 】
比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也运行完了,所以用守护进程结束掉子进程即可