无论执行器类型如何,都使用并发.futures 传递队列

mat*_*ter 5 concurrent.futures python-multiprocessing

从线程到进程,我已切换到并发。futures,并且希望获得/保留在各种情况下在 aThreadPoolExecutor和 a之间切换的灵活性ProcessPoolExecutor。然而,尽管承诺有一个统一的外观,但当我切换到使用时,我很难将多处理Queue对象作为参数传递:futures.submit()ProcessPoolExecutor

\n
import multiprocessing as mp\nimport concurrent.futures\n\ndef foo(q):\n    q.put('hello')\n\nif __name__ == '__main__':\n\n    executor = concurrent.futures.ProcessPoolExecutor()\n    q = mp.Queue()\n    p = executor.submit(foo, q)\n    p.result()\n    print(q.get())\n
Run Code Online (Sandbox Code Playgroud)\n

遇到来自多处理代码的以下异常:

\n
\n

RuntimeError:队列对象只能通过继承在进程之间共享

\n
\n

我认为这意味着它不喜欢接收队列作为参数,而是期望(不是在任何 OOP 意义上)在多处理分支上“继承它”,而不是将其作为参数获取。

\n

不同之处在于,对于简单的多处理,这意味着当不通过并发.futures 为 \xe2\x80\x95 的外观使用它时,似乎没有这样的限制,因为以下代码可以无缝工作:

\n
import multiprocessing as mp\n\ndef foo(q):\n    q.put('hello')\n\nif __name__ == '__main__':\n    q = mp.Queue()\n    p = mp.Process(target=foo, args=(q,))\n    p.start()\n    p.join()\n    print(q.get())\n
Run Code Online (Sandbox Code Playgroud)\n

我想知道我在这个 \xe2\x80\x95 中缺少什么,如何ProcessPoolExecutor在使用并发.futures 时接受队列作为参数,就像使用 or ThreadPoolExecutormultiprocessing 时一样直接如上所示?

\n