python - 使用 python 多进程时在 (CLOSE, TERMINATE) 中断言 self._state
问题描述
我目前正在尝试使用 python 多处理。我使用的库是multiprocess
(NOT multiprocessing
)。
我有以下代码,它创建了许多计算作业,并通过映射操作运行它:
pool = multiprocess.Pool(4)
all_responses = pool.map_async(wrapper_singlerun, range(10000))
pool.join()
pool.close()
但是,每当我运行这段代码时,都会收到以下错误:
pool.join()
File "/Users/davidal/miniconda3/lib/python3.6/site-packages/multiprocess/pool.py", line 509, in join
assert self._state in (CLOSE, TERMINATE)
AssertionError
您知道为什么会发生此错误吗?我以前用过pool.map_async
,但认为我需要一个pool rendez-vous
命令。否则,我的电脑创建了类似 forkbomb 的东西,它创建了太多线程(至少,我认为它是这样做的......)
任何想法表示赞赏!
解决方案
问题是你join
之前打电话close
。
multiprocess
似乎缺少它的文档,但是,据我所知,它基本上是multiprocessing
pre-monkeypatches dill
for中的 stdlib 的一个分支pickle
,因此multiprocessing
文档应该与此处相关。(另外,在评论中,你说你可以用 . 重现问题multiprocessing
。)
所以,Pool.join
说:
等待工作进程退出。必须调用
close()
或terminate()
使用之前join()
。
该close
方法是关闭队列的发送端以便无法添加新任务的方式。该join
方法是您等待处理队列中所有内容的方式。在关闭之前等待队列耗尽是行不通的。
但是你打电话给close
after join
,而不是 before 。第一件事join
是你已经assert
调用了close
or terminate
,但你没有调用,因此断言失败。
因此,您可能只想切换这两个调用的顺序。
或者,也许您对什么join
是 for 感到困惑,并认为您需要先调用它,然后才能使用all_responses.get()
or .wait()
。如果是这样——你不需要这样做;将get
阻塞,直到结果可用,之后您不需要join
. 这实际上更常见,尤其是map
和朋友一起使用(尽管文档中的示例是通过 awith Pool(…) as pool:
而不是手动调用池中的任何内容)。
推荐阅读
- google-chrome - 使用“host-resolver-rules”运行 ChromeDriver 在本地工作,但在 Heroku 上失败
- flutter - 已解决:Flutter Provider:在更改屏幕时消失数据
- elasticsearch - 使用 Elastic 搜索不同的搜索网站
- javascript - 无法弄清楚正确编辑 JS 对象的算法
- android - 如何使用材质库使 FloatingActionButton 成为正方形?
- javascript - 如何从两个 iframe 中获取元素
- listview - SwiftUI 列表在删除后继续显示核心数据项
- reactjs - 如何在 React.js 中不使用 onSubmit 清除输入字段
- ios - 如何在从 iOS 上的 AWS S3 存储桶下载本地文件时访问它?
- haskell - 如何在 Haskell 中删除字符串中的最后一个字符(不使用 init)?