我正在开发一个分析大文件的工具。为了做到这一点,我引入了多处理,并且一切看起来都很好。为了做到这一点,我使用multiprocessing.pool创建了N个线程,并处理了我以前创建的不同块。python多处理。池长时间执行后卡住了
pool = Pool(processes=params.nthreads)
for chunk in chunk_list:
pool.apply_async(__parallel_quant, [filelist, chunk, outfilename])
pool.close()
pool.join()
正如您所看到的,这是标准池执行,没有特殊用法。
最近我发现一个问题,当我运行一个非常大量的数据。标准执行大约需要2个小时,有16个线程,但我有一个特殊情况需要大约8个小时,因为它的文件和大小非常大。
的问题是,最近我发现,当我执行这种情况下,执行运行良好,直到终点,大多数孩子的的完成正确,除了一个得到stucked上
<built-in method recv of _multiprocessing.Connection object at remote 0x3698db0>
因为这个孩子没有完成父母不会醒来,执行停止。
这种情况只发生在输入文件非常大时,所以我想知道是否有任何一种默认超时会导致此问题。
我使用Python 2.7 多处理0.70a1
和我的机器是一个CentOS 7(32个核心,64GB RAM)
在此先感谢您的帮助
霍尔迪
我认为问题在于您不保留结果对象并调用result.get()将结果消息从队列中拉出。 – tdelaney 2014-12-02 16:16:01
我没有任何结果。我把结果放在一个pickle文件中,父母读取并收集它们。 – jvaquero 2014-12-02 17:44:36
无论您的目标函数是否返回值,apply_async总是返回一个ApplyResult对象。我的猜测是结果队列填满了子进程块。如果将结果添加到列表中,然后执行result for result:result.get(),它将冲洗队列。我不是100%肯定的,所以没有把它写成答案。 – tdelaney 2014-12-02 17:53:11