Python multiprocessing Process和Pipe管理问题

原因:应该特别注意管道端点的正确管理问题。

1.如果是生产者或消费者中都没有使用管道的某个端点,就应将它关闭。
2.这也说明了为何在生产者中关闭了管道的输出端,在消费者中关闭管道的输入端。
3.如果忘记执行这些步骤,程序可能在消费者中的recv()操作上挂起。
4.管道是由操作系统进行引用计数的,必须在所有进程中关闭管道后才能生成EOFError异常。
5.因此,在生产者中关闭管道不会有任何效果,除非消费者也关闭了相同的管道端点。

# coding=utf-8
import logging
import multiprocessing

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [*] %(processName)s %(message)s"
)


def consumer (left, right):
    left.close()  # 因为右管道要发送信息,还要接收信息,这里用不到左管道
    logging.info(f'>>> 右管道发送的信息:【你好】')
    right.send("【你好】")  # 1.给左管道发送信息
    while True:
        try:
            logging.info(f"\t\t右管道接收的信息:{right.recv()}")
        except EOFError:
            break


def main (ctx):
    left, right = ctx.Pipe()
    ctx.Process(target=consumer, args=(left, right)).start()
    logging.info(f"\t\t左管道接收的信息:{left.recv()}")  # 2.接收右管道的信息
    
    right.close()  # 左管道要发信息,所以右管道关闭
    for i in range(10):
        logging.info(f'\t>>> 左管道发送的信息:【{i}个包子】')
        left.send(f'【{i}个包子】')
    left.close()  # 发信息完要关闭,因为后面不在发信息了


if __name__ == '__main__':
    # windows 启动方式
    multiprocessing.set_start_method('spawn')
    # 获取上下文
    ctx = multiprocessing.get_context('spawn')
    # 检查这是否是冻结的可执行文件中的伪分支进程。
    ctx.freeze_support()
    main(ctx)

输出:

2019-10-05 18:57:27,765 [*] SpawnProcess-1 >>> 右管道发送的信息:【你好】
2019-10-05 18:57:27,765 [*] MainProcess 		左管道接收的信息:【你好】
2019-10-05 18:57:27,766 [*] MainProcess 	>>> 左管道发送的信息:【0个包子】
2019-10-05 18:57:27,766 [*] MainProcess 	>>> 左管道发送的信息:【1个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 		右管道接收的信息:【0个包子】
2019-10-05 18:57:27,766 [*] MainProcess 	>>> 左管道发送的信息:【2个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 		右管道接收的信息:【1个包子】
2019-10-05 18:57:27,766 [*] MainProcess 	>>> 左管道发送的信息:【3个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 		右管道接收的信息:【2个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 		右管道接收的信息:【3个包子】
2019-10-05 18:57:27,766 [*] MainProcess 	>>> 左管道发送的信息:【4个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 		右管道接收的信息:【4个包子】
2019-10-05 18:57:27,766 [*] MainProcess 	>>> 左管道发送的信息:【5个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 		右管道接收的信息:【5个包子】
2019-10-05 18:57:27,766 [*] MainProcess 	>>> 左管道发送的信息:【6个包子】
2019-10-05 18:57:27,767 [*] SpawnProcess-1 		右管道接收的信息:【6个包子】
2019-10-05 18:57:27,767 [*] MainProcess 	>>> 左管道发送的信息:【7个包子】
2019-10-05 18:57:27,767 [*] SpawnProcess-1 		右管道接收的信息:【7个包子】
2019-10-05 18:57:27,767 [*] MainProcess 	>>> 左管道发送的信息:【8个包子】
2019-10-05 18:57:27,767 [*] SpawnProcess-1 		右管道接收的信息:【8个包子】
2019-10-05 18:57:27,767 [*] MainProcess 	>>> 左管道发送的信息:【9个包子】
2019-10-05 18:57:27,767 [*] SpawnProcess-1 		右管道接收的信息:【9个包子】
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值