gpt4 book ai didi

python - 为什么多处理模块可以pickle调用匿名函数的函数?

转载 作者:行者123 更新时间:2023-12-01 09:25:01 25 4
gpt4 key购买 nike

我正在编写一些代码(在 Mac 上运行),这些代码依赖于编写一长串函数并使用多处理将生成的函数应用到列表。如果运行以下代码,我会收到 AttributeError,因为 multiprocessing 模块需要 pickle 函数,但无法 pickle 匿名函数。

import multiprocessing
import functools

def compose(*functions):
return functools.reduce(lambda f, g: lambda x: f(g(x)), functions, lambda x: x

twox = lambda x: 2*x
funcs = [twox, twox, twox]
operation = compose(*funcs)
nums = range(10)

p = multiprocessing.Pool(processes=3)
p.map(operation, nums) ## raises an AttributeError

我明白为什么这段代码失败了。令人费解的是,如果我创建一个只调用操作的函数,一切都会正常工作。换句话说,以下代码返回正确的结果:

def wrapped_operation(x):
return operation(x)

p = multiprocessing.Pool(processes=3)
p.map(wrapped_operation, nums) ## returns [0,8,16,...]

这是为什么呢?在我看来,如果Python需要picklewrapped_operation,它应该会遇到pickle操作的子问题并抛出某种错误。我在这里有什么误解吗?仅用非匿名函数包装匿名函数有什么问题吗?

最佳答案

wrapped_operation 是一个普通的命名函数。对它的调用可以从父进程到子进程进行腌制。

在第二个变体中,匿名操作的创建和调用仅发生在子进程中(或者发生在之前 fork 的父进程中,具体取决于多处理操作模式)。所以它永远不会跨越进程之间的边界。

关于python - 为什么多处理模块可以pickle调用匿名函数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50499080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com