python 多处理。长时间执行后池卡住了

标签 python python-multiprocessing

我正在开发一个分析大文件的工具。为了更快地做到这一点,我在它上面引入了多处理,一切似乎都运行良好。为了做到这一点,我使用 multiprocessing.pool 创建 N 个线程,它们处理我之前创建的不同工作 block 。

pool = Pool(processes=params.nthreads)
for chunk in chunk_list:
    pool.apply_async(__parallel_quant, [filelist, chunk, outfilename])

pool.close()
pool.join()

如您所见,这是标准的池执行,没有特殊用途。

最近我在运行大量数据时发现了一个问题。 16 个线程的标准执行大约需要 2 个小时,但我有一个特殊情况需要大约 8 个小时,因为它的文件量和大小都非常大。

问题是最近我发现当我执行这个案例时,执行一直运行良好直到完成,除了一个卡住的 child 之外,大多数 child 都正确完成

<built-in method recv of _multiprocessing.Connection object at remote 0x3698db0>

由于这个 child 没有完成,所以 parent 没有醒来,执行停止。

这种情况只有在输入文件非常大的时候才会发生,所以我想知道是否有任何一种默认超时会导致这个问题。

我正在使用 python 2.7 多处理 0.70a1

我的机器是 centos 7(32 核,64GB RAM)

预先感谢您的帮助

霍尔迪

最佳答案

来自多处理编程指南:

Avoid shared state

As far as possible one should try to avoid shifting large amounts of data between processes.

如果您必须通过多个进程拆分文件处理,最好指导它们如何检索文件 block ,而不是自己发送 block 。

尝试将 block 偏移量和 block 大小传递给子进程。它可以使用 open() 和 seek() 从文件中检索 block 。您会注意到性能的提高和内存占用量的减少。

关于 python 多处理。长时间执行后池卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27253666/

相关文章:

python - 使用 Keras (PIL) 和 TensorFlow 调整图像大小不一致?

python - "Registration timeout"在非常基本的 Python IRC 机器人上

python - 并行响应多个传入的Slack-Bot请求

python - 如何在Python中使用多重处理生成大型语料库的tfdf?

python - 将多个大 numpy 数组作为共享内存进行多处理

python - Gurobi 的多处理兼容性问题

python - django 两次连接到数据库

python - (Py)Spark中如何使用JDBC源读写数据?

python - 将长数据帧转换为宽数据帧

python pool apply_async 和 map_async 不会在完整队列上阻塞