【发布时间】:2016-10-25 08:16:07
【问题描述】:
我需要执行下面的代码(我在 Python 3.5 中的真实代码库的简化版):
import multiprocessing
def forever(do_something=None):
while True:
do_something()
p = multiprocessing.Process(target=forever, args=(lambda: print("do something"),))
p.start()
为了创建新进程,Python 需要腌制函数和作为目标传递的 lambda。 不幸的是,pickle 无法序列化 lambda,输出如下:
_pickle.PicklingError: Can't pickle <function <lambda> at 0x00C0D4B0>: attribute lookup <lambda> on __main__ failed
我发现cloudpickle 可以序列化和反序列化 lambda 和闭包,使用与 pickle 相同的接口。
如何强制 Python 多处理模块使用 cloudpickle 而不是 pickle?
显然破解标准库多处理的代码不是一种选择!
谢谢
查理
【问题讨论】:
-
绝对有必要使用
lambda函数吗? -
是的,这是绝对必要的!
-
为什么有必要?在您发布的代码中看起来没有必要。
-
正如我所提到的,发布的代码是我的代码库的简化版本。更改代码库不是一种选择。请继续关注这个问题;-)
-
也许检查
cloudpickle的源代码,看看它是如何完成的?那么想办法包装 lambdas 呢?
标签: python lambda pickle python-multiprocessing