Я никогда раньше не использовал многопроцессорную библиотеку, поэтому все советы приветствуются ..Как я могу поймать ошибку памяти в порожденной теме?
У меня есть программа, которая использует питон многопроцессорную библиотеку, чтобы сделать некоторые памяти ресурсоемких задач в различных процессах, которые иногда выбегают (я работаю над оптимизацией, но это не тот вопрос, о котором идет речь). Иногда ошибка из-за памяти возникает так, что я не могу ее поймать (вывод ниже), а затем программа зависает на 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
хорошо, если он не может перераспределить память, что вы действительно можете сделать? вы должны использовать некоторые защитные программы, чтобы избежать этой ошибки, и если ошибка произошла, поймайте ее, а затем сделайте кое-что, чтобы ее обработать. что это за штука, я не знаю. – jgr208
да ... Я не уверен, как его поймать, поскольку, похоже, это поток, управляемый модулем многопроцессорности python. – Sveltely
, вам, возможно, придется заглянуть в документацию, затем с тем, что выбрасывается из какого класса. Таким образом, на данный момент кажется, что лучший подход - защитное программирование, чтобы избежать ошибки выделения памяти. – jgr208