gpt4 book ai didi

python - ProcessPoolExecutor 无法执行我自己的功能,但执行打印工作

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

代码:

if __name__ == "__main__":
p = ProcessPoolExecutor()
p.submit(lambda x: print(x), "something") # doesn't work
p.submit(print, "something") # works fine
time.sleep(0.5)

为什么这是有道理的?

最佳答案

ProcessPoolExecutor 想要 pickle 函数,但由于 lambda 没有名称,因此无法找到它来 pickle。

例如:

from pickle import dumps

def fun(x):
print(x)

lmb = lambda x: print(x)

dumps(fun) # succeeds
dumps(lmb) # fails

所以,这会工作得很好:

import time
from concurrent.futures import ThreadPoolExecutor


def fun(x):
print(x)


if __name__ == "__main__":
p = ThreadPoolExecutor()
lmb = lambda x: print(x)
p.submit(lmb, "lambda") # works fine
p.submit(fun, "local function") # works fine
p.submit(print, "built-in function") # works fine
time.sleep(0.5)

但如果您将 ThreadPoolExecutor() 替换为 ProcessPoolExecutor(),这将需要 pickle 函数,lambda 将停止工作。

from concurrent.futures import ProcessPoolExecutor


if __name__ == "__main__":
p = ProcessPoolExecutor()
lmb = lambda x: print(x)
future = p.submit(lmb, "lambda") # doesn't work
print(future.result())

这说明问题确实是在pickling的时候出现的,同时也说明了原因:

_pickle.PicklingError: Can't pickle <function <lambda> at 0x00000294E66B3E20>: attribute lookup <lambda> on __main__ failed

__main__ 是主进程,它的命名空间中没有 lambda,因为 lambda 本身是无名的。将它分配给像 lmb 这样的变量不会改变这一点,因为 lambda 是从变量中取消引用的。其他两个函数固有地在 __main__ 的命名空间中有一个名称,并且可以被 pickle。

请注意 __main__ 与您要测试的名称相同:

if __name__ == "__main__":

关于python - ProcessPoolExecutor 无法执行我自己的功能,但执行打印工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74064151/

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