Python multiprocessing Process, Pipe实例

原因:当使用多个进程通信时,使用Pipe传递消息进行进程间通信,并避免使用锁等同步原语

# coding=utf-8
import logging
import multiprocessing
from multiprocessing import Process, Pipe

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


def send (pipe):
    message = ['spam'] + [42, 'egg']
    pipe.send(message)
    logging.info(f"A01 发送信息:{message}-------单向通信")
    pipe.close()


def talk (pipe):
    message = dict(name='Bob', spam=42)
    pipe.send(message)
    logging.info(f"B02 发送信息:{message}----双向通信")
    reply = pipe.recv()
    logging.info(f"B02 接收信息:{reply}-------双向通信")


def main (ctx):
    # 单向通信--------------------------------------------------------
    (A01, A02) = ctx.Pipe()
    sender = ctx.Process(target=send, args=(A01,))
    sender.start()
    logging.info(f"A02 接收信息:{A02.recv()}----------单向通信")  # 从send收到消息
    A02.close()
    
    # 双向通信---------------------------------------------------------
    (B01, B02) = Pipe()
    # 1.B02发送信息
    talking = Process(target=talk, args=(B02,))
    talking.start()
    logging.info(f'B01 接收信息:{B01.recv()}--双向通信')
    # 2.B01发送信息
    message = {x * 2 for x in 'spam'}
    B01.send(message)
    logging.info(f"B01 发送信息{message}-------双向通信")
    
    talking.join()  # 阻塞并等待子进程通话完毕


if __name__ == '__main__':
    # windows 启动方式
    multiprocessing.set_start_method('spawn')
    # 获取上下文
    ctx = multiprocessing.get_context('spawn')
    main(ctx)

输出:

2019-10-04 11:21:32,466 [*] SpawnProcess-1 A01 发送信息:['spam', 42, 'egg']-------单向通信
2019-10-04 11:21:32,466 [*] MainProcess A02 接收信息:['spam', 42, 'egg']----------单向通信
2019-10-04 11:21:32,544 [*] Process-2 B02 发送信息:{'name': 'Bob', 'spam': 42}----双向通信
2019-10-04 11:21:32,544 [*] MainProcess B01 接收信息:{'name': 'Bob', 'spam': 42}--双向通信
2019-10-04 11:21:32,544 [*] MainProcess B01 发送信息{'aa', 'mm', 'ss', 'pp'}-------双向通信
2019-10-04 11:21:32,544 [*] Process-2 B02 接收信息:{'aa', 'ss', 'pp', 'mm'}-------双向通信
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中的`multiprocessing`模块是用于实现并行计算的工具,它提供了创建和管理进程的功能。`multiprocessing`模块中的`Process`类是用于创建进程的主要类。 使用`Process`类,你可以在程序中创建一个新的进程,并在该进程中执行特定的任务。下面是一个简单的示例代码: ```python import multiprocessing def worker(num): """子进程要执行的任务""" print(f'Worker {num} started') # 执行一些任务... print(f'Worker {num} finished') if __name__ == '__main__': # 创建三个子进程并启动 processes = [] for i in range(3): p = multiprocessing.Process(target=worker, args=(i,)) processes.append(p) p.start() # 等待所有子进程完成 for p in processes: p.join() print('All processes finished') ``` 在上面的代码中,我们定义了一个`worker`函数作为子进程要执行的任务。然后,在主进程中,我们创建了三个`Process`对象,并将`worker`函数作为目标函数传递给它们。通过`args`参数,我们可以向`worker`函数传递参数。 最后,我们启动了所有的子进程,并使用`join`方法等待它们完成。这样可以确保在主进程继续执行之前,所有的子进程都已经执行完毕。 请注意,为了避免在Windows下出现意外的行为,我们将创建进程的代码包装在`if __name__ == '__main__':`条件中。这是由于Windows操作系统的进程启动方式与Unix-like系统有所不同。 希望这能帮到你!如果有任何问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷心兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值