使用python multiprocess时,在(CLOSE,TERMINATE)中声明self._state

Dav*_*eAl 3 python multiprocessing multiprocess threadpool python-multiprocessing

我目前正在尝试使用python多处理.我使用的库是multiprocess(NOT multiprocessing).

我有以下代码,它创建了许多计算作业,并通过映射操作运行它:

pool = multiprocess.Pool(4)
all_responses = pool.map_async(wrapper_singlerun, range(10000))
pool.join()
pool.close()
Run Code Online (Sandbox Code Playgroud)

但是,每当我运行此代码片段时,我都会收到以下错误:

    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
Run Code Online (Sandbox Code Playgroud)

你知道为什么会发生这个错误吗?我pool.map_async以前用过,但想到我需要一个pool rendez-vous命令.否则,我的PC创建了类似forkbomb的东西,它创建了太多的线程(至少,这是我认为它做的......)

任何想法都表示赞赏!

aba*_*ert 11

问题是你join以前打过电话close.

multiprocess似乎缺少了它的文档,但据我所知,它基本上是stdlib的multiprocessing一个前缀monkeypatches dillfor for 的分支pickle,所以multiprocessing这里的文档应该是相关的.(另外,在评论中,你说你可以重新解决问题multiprocessing.)

所以,Pool.join说:

等待工作进程退出.必须打电话close()terminate()使用之前join().

close方法是关闭队列的发送方以便无法添加新任务的方法.该join方法是您如何等待队列中的所有内容进行处理.在关闭之前等待队列排空是行不通的.

但是你close之后join,而不是之前,都在呼唤.而第一件事情join确实assert你已经叫close或者terminate,你有没有,因此断言失败.

所以,您可能只想切换这两个调用的顺序.

或者,也许你感到困惑什么join是了,以为你需要调用它之前,你可以使用all_responses.get().wait().如果是这样的话 - 你不需要这样做; 在get将阻塞,直到结果出来,之后就不需要join.这实际上更常见,尤其是map和朋友一起(尽管文档中的示例通过with Pool(…) as pool:而不是手动调用池中的任何内容来实现).