Python multiprocessing JoinableQueue和Process实例

原因: 创建可连接的共享进程队列。这就像是一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值