python - 使用 python 多进程时在 (CLOSE, TERMINATE) 中断言 self._state

标签 python multiprocessing threadpool python-multiprocessing multiprocess

我目前正在尝试使用 python 多处理。我使用的库是 multiprocess(不是 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 命令。否则,我的 PC 会创建类似于 forkbomb 的东西,它会创建太多线程(至少,我认为它是这样的……)

欢迎任何想法!

最佳答案

问题是您在 close 之前调用了 join

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

所以,Pool.join说:

Wait for the worker processes to exit. One must call close() or terminate() before using join().

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

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

因此,您可能只想调换这两个调用的顺序。

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

关于python - 使用 python 多进程时在 (CLOSE, TERMINATE) 中断言 self._state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50593550/

相关文章:

python - 多处理 numpy 未定义错误

python - 多处理中的共享内存

java - 如何在 Java 中重用一个线程?

python - python中的编码问题

python - 多处理和带指针的 ctypes

.net - .net 中的异步套接字是无线程的吗?

c# - 部分工作完成两次(ThreadPool.QueueUserWorkItem)

python - conda与caffe一起安装openCV 3.4.2,但不能单独删除

python - 了解 Python 中的数据封装

python - 如何在不影响主图规模的情况下绘制平面?