【问题标题】:assert self._state in (CLOSE, TERMINATE) when using python multiprocess使用 python 多进程时在 (CLOSE, TERMINATE) 中断言 self._state
【发布时间】:2018-11-08 15:38:33
【问题描述】:

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

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

pool = multiprocess.Pool(4)
all_responses = pool.map_async(wrapper_singlerun, range(10000))
pool.join()
pool.close()

但是,每当我运行这个 sn-p 代码时,我都会收到以下错误:

    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 的东西,它会创建太多线程(至少,我认为它是这样做的......)

感谢任何想法!

【问题讨论】:

  • 您的代码是在 if __name__ == '__main__': 块中,还是在模块的顶层?
  • 这段代码被编码在一个类中,在几层函数中实例化。初始函数确实在if __name__ == "__main__":之内
  • multiprocess homepage 链接到docs that don't exist。这使得调试任何与multiprocessing 不同的东西变得非常困难。但似乎唯一的区别是 (a) multiprocess pre-monkeypatches dill 代替 pickle 和 (b) 可能落后几个版本。那么……你能用multiprocessing重现同样的问题吗?
  • 显然我对multiprocessing 有同样的问题(当我用pool = multiprocessing.Pool(4) 替换pool = multiprocess.Pool(4)
  • @abarnert,更具体地说,multiprocessing 模块给了我一个酸洗错误,这就是为什么我切换到另一个库(因为它使用莳萝)

标签: python multiprocessing threadpool python-multiprocessing multiprocess


【解决方案1】:

问题是你在close之前调用join

multiprocess 似乎是missing its documentation,但据我所知,它基本上是stdlib multiprocessing 的一个分支,用于pickle 的pre-monkeypatches dill,所以multiprocessing文档在这里应该是相关的。 (另外,在评论中,您说您可以使用multiprocessing 重现该问题。)

所以,Pool.join 说:

等待工作进程退出。在使用join() 之前,必须先致电close()terminate()

close 方法是关闭队列发送端的方法,因此无法添加新任务。 join 方法是等待队列中所有内容被处理的方式。在关闭之前等待队列耗尽是行不通的。

但是您在join 之后调用close,而不是之前。而the first thing join doesassert,你已经调用了closeterminate,而你还没有调用,因此断言失败。

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

或者,或者,您可能对join 的用途感到困惑,并认为您需要先调用它才能使用all_responses.get().wait()。如果是这样——你不需要这样做; get 将阻塞,直到结果可用,之后您不需要 join。这实际上更常见,尤其是map 和朋友(尽管文档中的示例是通过with Pool(…) as pool: 来实现的,而不是手动调用池中的任何内容)。

【讨论】:

  • @abamert,这很有帮助。如果这段代码在一个循环中,由于池在每个循环后都关闭,我可以在下一个循环开始时“重新打开”池还是我必须在每个循环中做一个新的pool = multiprocessing.Pool(4)?跨度>