【问题标题】:python multiprocessing. Pool got stuck after long executionpython多处理。长时间执行后,池卡住了
【发布时间】: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


【解决方案1】:

来自多处理编程指南:

避免共享状态

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

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

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

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2018-12-15
    相关资源
    最近更新 更多