Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在生成的线程中捕获内存错误?_Python_Python 2.7_Memory_Python Multiprocessing - Fatal编程技术网

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

Python 如何在生成的线程中捕获内存错误?,python,python-2.7,memory,python-multiprocessing,Python,Python 2.7,Memory,Python Multiprocessing,我以前从未使用过多处理库,因此欢迎提供所有建议 我有一个python程序,它使用多处理库在多个进程中执行一些内存密集型任务,有时会耗尽内存(我正在进行优化,但这不是这个问题的重点)。有时,以我似乎无法捕获的方式抛出内存不足错误(下面的输出),然后程序挂起在pool.join()(我使用的是multiprocessing.pool)。在出现此问题时,我如何使程序不无限期地等待 理想情况下,内存错误传播回主进程,然后主进程死亡 以下是内存错误: Exception in thread Thread-

我以前从未使用过多处理库,因此欢迎提供所有建议

我有一个python程序,它使用多处理库在多个进程中执行一些内存密集型任务,有时会耗尽内存(我正在进行优化,但这不是这个问题的重点)。有时,以我似乎无法捕获的方式抛出内存不足错误(下面的输出),然后程序挂起在
pool.join()
(我使用的是
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
当我中断挂起程序时,我得到:

Process process_003:
Traceback (most recent call last):
  File "/opt/rh/python27/root/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/opt/rh/python27/root/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "/opt/rh/python27/root/usr/lib64/python2.7/multiprocessing/pool.py", line 102, in worker
    task = get()
  File "/opt/rh/python27/root/usr/lib64/python2.7/multiprocessing/queues.py", line 374, in get
    return recv()
    racquire()
KeyboardInterrupt
这实际上是一个在Python3()中修复的补丁。有一个附加到的补丁,但尚未正式应用


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

如果它无法重新分配内存,您真正能做什么?您应该使用一些防御编程来避免此错误,如果错误发生,捕获它,然后执行一些操作来处理它。这些操作是什么我不知道。是的……我不确定如何捕获它,因为它似乎来自py管理的线程thon multiprocessing module。您可能需要查看文档,然后查看从哪个类抛出的内容。因此,到目前为止,似乎最好的方法是防御性编程,以避免内存分配错误。在Python 3.6中仍然没有修复。我改为使用
concurrent.Futures.ProcessPoolExecutor
,而不是e> 多处理.Pool,它将引发
BrokenProcessPool
异常。