如何在生成的线程中捕获内存错误?

时间:2015-02-18 18:52:09

标签: python python-2.7 memory python-multiprocessing

我之前从未使用过多处理库,所以欢迎所有建议。

我有一个python程序,它使用多处理库在多个进程中执行一些内存密集型任务,这些任务偶尔会耗尽内存(我正在进行优化,但是这样做了不是这个问题是什么)。有时,内存错误会以我无法捕获的方式(下面的输出)被抛出,然后程序挂起pool.join()(我使用{{1}当问题发生时,我怎样才能让程序做一些事情而不是无限期地等待呢?

理想情况下,内存错误会传播回主进程,然后主进程就会死掉。

这是内存错误:

multiprocessing.Pool

在这里我管理多处理:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 764, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 325, in _handle_workers
    pool._maintain_pool()
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 229, in _maintain_pool
    self._repopulate_pool()
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 222, in _repopulate_pool
    w.start()
  File "/usr/lib64/python2.7/multiprocessing/process.py", line 130, in start
    self._popen = Popen(self)
  File "/usr/lib64/python2.7/multiprocessing/forking.py", line 121, in __init__
    self.pid = os.fork()
OSError: [Errno 12] Cannot allocate memory 

当我打断挂起程序时,我得到:

mp_pool = mp.Pool(processes=num_processes)
mp_results = list()
for datum in input_data:
    data_args = {
         'value': 0 // actually some other simple dict key/values
    }
    mp_results.append(mp_pool.apply_async(_process_data, args=(common_args, data_args)))
frame_pool.close()
frame_pool.join()  // hangs here when that thread dies..
for result_async in mp_results:
    result = result_async.get()
    // do stuff to collect results
// rest of the code

1 个答案:

答案 0 :(得分:1)

这实际上是known bug in python's multiprocessing module,已在python 3(here's a summarizing blog post I found)中修复。 python issue 22393附有一个补丁,但尚未正式应用。

基本上,如果多进程池的子进程之一意外死亡(内存不足,外部死亡等),则池将无限期地等待。