我正在开发一个分析大文件的工具。为了更快地做到这一点,我在它上面引入了多处理,一切似乎都运行良好。为了做到这一点,我使用 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/