python-multiprocessing - 无论执行者类型如何,都使用 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 多处理时一样,如上图所示?
解决方案
推荐阅读
- django - 从 POST 保存表单时如何填写空白字段
- python - Python Pandas:数据框不使用字符串方法更新
- java - 如何实现一个键值可变的键值对
- dart - 向 Flutter 中的计算函数发送多个参数
- android - 如何在android中使用Retrofit和GSON从api获取整个JSON响应
- angularjs - 错误:[$controller:ctrlreg] 名为“FirstNameController”的控制器未注册
- android - 在 Android WebView 上具有自签名证书的服务人员
- solr - TYPO3 Solr:如何重新索引文件,该文件在 TYPO3 的 tt_content 元素中链接
- python - 有什么方法可以实时从 UDP 数据包中提取有效负载并将该有效负载用于另一个应用程序?
- collision-detection - 两个物体形状的Hittest