首页 > 解决方案 > 无论执行者类型如何,都使用 concurrent.futures 传递队列

问题描述

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

import multiprocessing as mp
import concurrent.futures

def foo(q):
    q.put('hello')

if __name__ == '__main__':

    executor = concurrent.futures.ProcessPoolExecutor()
    q = mp.Queue()
    p = executor.submit(foo, q)
    p.result()
    print(q.get())

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

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

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

不同之处在于,使用准系统的多处理,这意味着当不通过 concurrent.futures 的外观使用它时——似乎没有这样的限制,因为以下代码可以无缝工作:

import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    q = mp.Queue()
    p = mp.Process(target=foo, args=(q,))
    p.start()
    p.join()
    print(q.get())

我想知道我对此遗漏了什么——如何ProcessPoolExecutor在使用 concurrent.futures 时将接受队列作为参数与ThreadPoolExecutor直接使用 or 多处理时一样,如上图所示?

标签: python-multiprocessingconcurrent.futures

解决方案


推荐阅读