调用时,apply_async
它返回一个AsyncResult
对象,并将工作负载分配留给单独的线程(另请参见此答案)。该线程遇到Queue
无法腌制对象的问题,因此无法分发(最终执行)所请求的工作。我们可以通过调用AsyncResult.get
以下内容来查看:
r = p.apply_async(f,args=(q,))
r.get()
这引发了RuntimeError
:
RuntimeError: Queue objects should only be shared between processes through inheritance
但是RuntimeError
,只有在您请求结果后才会在主线程中引发此错误,因为它实际上发生在其他线程中(因此需要一种传输方式)。
所以当你做的时候会发生什么
p.apply_async(f,args=(q,))
是f
永远不会调用目标函数,因为它的参数(q
)之一不能被腌制。因此,q
永远不会收到任何项目并保持为空,因此,q.get
在主线程中的调用将永远阻塞。
使用apply_async
您,您不必手动管理结果队列,但是它们很容易以AsyncResult
对象的形式提供给您。因此,您可以修改代码以仅从目标函数返回:
from multiprocessing import Queue, Pool
def f():
return [42, None, 'hello']
if __name__ == '__main__':
q = Queue()
p = Pool(1)
result = p.apply_async(f)
print(result.get())