【发布时间】:2015-01-30 22:48:24
【问题描述】:
我正在开发一个分析大文件的工具。为了更快地做到这一点,我在上面引入了多处理,一切似乎都运行良好。为了做到这一点,我使用 multiprocessing.pool 创建 N 个线程,它们处理我之前创建的不同工作块。
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 小时,因为它的文件数量和文件大小非常大。
问题是最近我发现当我执行这个案例时,执行运行良好,直到完成,大多数孩子都正常完成,除了一个卡住了
<built-in method recv of _multiprocessing.Connection object at remote 0x3698db0>
由于这个孩子没有完成,父母没有醒来并且执行停止。
这种情况只发生在输入文件非常大的情况下,所以我想知道是否有任何类型的默认超时会导致这个问题。
我正在使用 python 2.7 多处理 0.70a1
而我的机器是 centos 7(32 核,64GB RAM)
提前感谢您的帮助
乔迪
【问题讨论】:
-
我认为问题在于您没有保留结果对象并调用 result.get() 将结果消息拉出队列。
-
我没有任何结果。我将结果放在一个 pickle 文件中,父级读取并收集它们。
-
apply_async 始终返回一个 ApplyResult 对象,无论您的目标函数是否返回值。我的猜测是结果队列已满,因此子进程阻塞。如果您将结果添加到列表然后执行
for result in results: result.get(),它将刷新队列。我不是 100% 确定的,所以没有把它写成答案。 -
我尝试了该更改,但没有解决问题。
标签: python python-multiprocessing