原因: 创建可连接的共享进程队列。这就像是一个Queue对象,但队列允许项目的使用者通知生产者项目已经被成功处理。通知进程是使用共享的信号和条件变量来实现的。
# coding=utf-8
import random
import time
import logging
import multiprocessing
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [*] %(message)s"
)
'''
multiprocessing模块支持进程间通信的两种主要形式:管道和队列
都是基于消息传递实现的,但是队列接口
'''
def consumer (q, name):
# 处理数据
while True:
time.sleep(random.uniform(0.5, 1))
food = q.get()
q.task_done() # 通知队列已经有一个数据被处理了
logging.info(f'\t{name} {food}')
def producer (q, name, food):
# 获取数据
for i in range(1, 11):
q.put("拿了" + food + "的编号:" + str(i))
logging.info(f'{name} 生产{food}的编号:{i}')
time.sleep(random.uniform(0.3, 0.8))
def main (ctx):
q = ctx.JoinableQueue()
c1 = ctx.Process(target=consumer, args=(q, '迷心兔'))
c2 = ctx.Process(target=consumer, args=(q, '明小明'))
c1.daemon = True # 设置守护进程
c2.daemon = True # 设置守护进程
c1.start()
c2.start()
p1 = ctx.Process(target=producer, args=(q, 'AAA', '包子'))
p2 = ctx.Process(target=producer, args=(q, 'BBB', '馒头'))
p1.start()
p2.start()
p1.join() # 生产者要先把所有的数据都放到队列中
p2.join() # 生产者要先把所有的数据都放到队列中
q.join() # 阻塞直到放入队列中所有的数据都被处理掉(有多少个数据就接收到了多少task_done)
if __name__ == '__main__':
# windows 启动方式
multiprocessing.set_start_method('spawn')
# 获取上下文
ctx = multiprocessing.get_context('spawn')
# 检查这是否是冻结的可执行文件中的伪分支进程。
ctx.freeze_support()
main(ctx)
输出:
2019-10-05 13:54:17,279 [*] BBB 生产馒头的编号:1
2019-10-05 13:54:17,279 [*] AAA 生产包子的编号:1
2019-10-05 13:54:17,825 [*] AAA 生产包子的编号:2
2019-10-05 13:54:17,838 [*] BBB 生产馒头的编号:2
2019-10-05 13:54:17,954 [*] 明小明 拿了馒头的编号:1
2019-10-05 13:54:18,150 [*] 迷心兔 拿了包子的编号:1
2019-10-05 13:54:18,303 [*] BBB 生产馒头的编号:3
2019-10-05 13:54:18,427 [*] AAA 生产包子的编号:3
2019-10-05 13:54:18,877 [*] BBB 生产馒头的编号:4
2019-10-05 13:54:18,882 [*] 明小明 拿了包子的编号:2
2019-10-05 13:54:19,048 [*] AAA 生产包子的编号:4
2019-10-05 13:54:19,049 [*] 迷心兔 拿了馒头的编号:2
2019-10-05 13:54:19,301 [*] BBB 生产馒头的编号:5
2019-10-05 13:54:19,519 [*] 明小明 拿了馒头的编号:3
2019-10-05 13:54:19,591 [*] 迷心兔 拿了包子的编号:3
2019-10-05 13:54:19,815 [*] AAA 生产包子的编号:5
2019-10-05 13:54:19,817 [*] BBB 生产馒头的编号:6
2019-10-05 13:54:20,121 [*] AAA 生产包子的编号:6
2019-10-05 13:54:20,143 [*] BBB 生产馒头的编号:7
2019-10-05 13:54:20,214 [*] 明小明 拿了馒头的编号:4
2019-10-05 13:54:20,265 [*] 迷心兔 拿了包子的编号:4
2019-10-05 13:54:20,517 [*] AAA 生产包子的编号:7
2019-10-05 13:54:20,739 [*] BBB 生产馒头的编号:8
2019-10-05 13:54:20,804 [*] 迷心兔 拿了馒头的编号:5
2019-10-05 13:54:21,002 [*] AAA 生产包子的编号:8
2019-10-05 13:54:21,012 [*] 明小明 拿了包子的编号:5
2019-10-05 13:54:21,317 [*] AAA 生产包子的编号:9
2019-10-05 13:54:21,466 [*] BBB 生产馒头的编号:9
2019-10-05 13:54:21,521 [*] 迷心兔 拿了馒头的编号:6
2019-10-05 13:54:21,829 [*] BBB 生产馒头的编号:10
2019-10-05 13:54:21,930 [*] AAA 生产包子的编号:10
2019-10-05 13:54:21,944 [*] 明小明 拿了包子的编号:6
2019-10-05 13:54:22,332 [*] 迷心兔 拿了馒头的编号:7
2019-10-05 13:54:22,615 [*] 明小明 拿了包子的编号:7
2019-10-05 13:54:23,030 [*] 迷心兔 拿了馒头的编号:8
2019-10-05 13:54:23,227 [*] 明小明 拿了包子的编号:8
2019-10-05 13:54:23,590 [*] 迷心兔 拿了包子的编号:9
2019-10-05 13:54:23,744 [*] 明小明 拿了馒头的编号:9
2019-10-05 13:54:24,532 [*] 明小明 拿了馒头的编号:10
2019-10-05 13:54:24,590 [*] 迷心兔 拿了包子的编号:10