问题
调用时,
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, Pooldef f(): return [42, None, 'hello']if __name__ == '__main__': q = Queue() p = Pool(1) result = p.apply_async(f) print(result.get())



