2015-02-18 2 views
2

Я никогда раньше не использовал многопроцессорную библиотеку, поэтому все советы приветствуются ..Как я могу поймать ошибку памяти в порожденной теме?

У меня есть программа, которая использует питон многопроцессорную библиотеку, чтобы сделать некоторые памяти ресурсоемких задач в различных процессах, которые иногда выбегают (я работаю над оптимизацией, но это не тот вопрос, о котором идет речь). Иногда ошибка из-за памяти возникает так, что я не могу ее поймать (вывод ниже), а затем программа зависает на 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 
+0

хорошо, если он не может перераспределить память, что вы действительно можете сделать? вы должны использовать некоторые защитные программы, чтобы избежать этой ошибки, и если ошибка произошла, поймайте ее, а затем сделайте кое-что, чтобы ее обработать. что это за штука, я не знаю. – jgr208

+0

да ... Я не уверен, как его поймать, поскольку, похоже, это поток, управляемый модулем многопроцессорности python. – Sveltely

+0

, вам, возможно, придется заглянуть в документацию, затем с тем, что выбрасывается из какого класса. Таким образом, на данный момент кажется, что лучший подход - защитное программирование, чтобы избежать ошибки выделения памяти. – jgr208

ответ

1

Это на самом деле known bug in python's multiprocessing module, зафиксированной в Python 3 (here's a summarizing blog post I found). Патч прикреплен к python issue 22393, но это официально не применяется.

В принципе, если один из подпроцессов многопроцессного пула неожиданно умирает (из-за нехватки памяти, убитого извне и т. Д.), Пул будет ждать бесконечно.

Смежные вопросы