为什么python多处理pickle对象在进程之间传递对象?

时间:2014-07-03 21:21:06

标签: python multiprocessing pickle

为什么python multiprocessing的{​​{1}}包反对在进程之间传递它们,即将不同进程的结果返回给主解释器进程?这可能是一个非常天真的问题,但是为什么不能处理A说出处理B“对象x在内存中的点y,它现在是你的”而不必执行将对象表示为字符串所必需的操作。

1 个答案:

答案 0 :(得分:6)

multiprocessing在不同的进程中运行作业。进程有自己独立的内存空间,通常不能通过内存共享数据。

要使进程通信,您需要某种通道。一个可能的渠道是“共享内存段”,这听起来几乎就是这样。但是使用“序列化”更常见。我没有广泛研究过这个问题,但我的猜测是共享内存解决方案太紧密了;序列化允许进程进行通信,而不会让一个进程导致另一个进程出错。

当数据集非常大且速度很关键时,共享内存段可能是最好的方法。我能想到的主要例子是视频帧缓冲图像数据(例如,从用户模式驱动程序传递到内核,反之亦然)。

http://en.wikipedia.org/wiki/Shared_memory

http://en.wikipedia.org/wiki/Serialization

Linux和其他* NIX操作系统提供了一种通过序列化共享数据的内置机制:“域套接字”这应该非常快。

http://en.wikipedia.org/wiki/Unix_domain_socket

由于Python pickle适用于序列化,multiprocessing使用它。 pickle是一种快速的二进制格式;它通常比XML或JSON等序列化格式更有效。还有其他二进制序列化格式,例如Google Protocol Buffers。

使用序列化的一个好处是:在一台计算机内共享工作(使用其他核心)或在多台计算机之间共享工作(在群集中使用多台计算机)大致相同。序列化工作是相同的,网络套接字的工作方式与域套接字类似。

编辑:@Mike McKerns在下面的评论中说,multiprocessing有时可以使用共享内存。我进行了Google搜索,发现了对它的精彩讨论:Python multiprocessing shared memory