gpt4 book ai didi

python - 如果从函数内部执行,带有 "apply_async"的多处理池不会执行任何操作

转载 作者:行者123 更新时间:2023-12-03 08:54:36 26 4
gpt4 key购买 nike

我正在尝试使用 multiprocessing模块,更具体地说是 Pool.apply_async()功能。

这段代码运行良好:

import multiprocessing

def do():
print("Foobar", flush=True)

with multiprocessing.Pool(1) as pool:
for i in range(2):
pool.apply_async(do)

pool.close()
pool.join()

“Foobar” 字符串打印两次。

但是,如果我将此代码放入函数中然后调用该函数,则不会发生任何情况。没有错误,也没有“Foobar”,程序静静地结束。

import multiprocessing

def test():

def do():
print("Foobar", flush=True)

with multiprocessing.Pool(1) as pool:
for i in range(5):
pool.apply_async(do)

pool.close()
pool.join()

test()

为什么呢?我在 Linux 上使用 Python 3.7.3。

最佳答案

为了检索计算结果,请对代码进行以下更改。

import multiprocessing

def test():

def do():
print("Foobar", flush=True)

with multiprocessing.Pool(1) as pool:
for i in range(5):
result = pool.apply_async(do)

result.get()

pool.close()
pool.join()

test()

您将看到“什么也没发生”的原因。

Traceback (most recent call last):
File "/tmp/test.py", line 17, in <module>
test()
File "/tmp/test.py", line 12, in test
result.get()
File "/usr/lib/python3.5/multiprocessing/pool.py", line 608, in get
raise self._value
File "/usr/lib/python3.5/multiprocessing/pool.py", line 385, in _handle_tasks
put(task)
File "/usr/lib/python3.5/multiprocessing/connection.py", line 206, in send
self._send_bytes(ForkingPickler.dumps(obj))
File "/usr/lib/python3.5/multiprocessing/reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
AttributeError: Can't pickle local object 'test.<locals>.do'

Python multiprocessing.Pool 依赖于 pickle 协议(protocol)来序列化要发送到其他进程的数据。 pickle 协议(protocol)只能序列化顶级函数,而不能序列化嵌套函数。

要查看什么可以腌制,什么不能腌制,请检查 documentation .

关于python - 如果从函数内部执行,带有 "apply_async"的多处理池不会执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56517936/

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