[英]Multiprocessing pool with “apply_async” does nothing if executed from inside a function
我正在嘗試使用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
協議來序列化要發送到其他進程的數據。 pickle
協議只能序列化頂級功能,而不能嵌套功能。
要查看可以腌制的內容和不能查看文檔的內容 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.