2015-10-23 2 views
2

Я использую пул процессов. Эта логика, похоже, работает до недавнего времени.Почему я не собираюсь обрабатывать зомби? (CentOS Linux, python)

pool = multiprocessing.Pool(processes = 2*multiprocessing.cpu_count()) 
for p in processArgs: 
    pool.apply_async(myFunc, p) 

pool.close() 
pool.join() 

Теперь, похоже, когда это выполняется, я в конечном итоге со всеми дочерними процессами в како состоянии и родительский процесс, кажется, не выполняется pool.join() еще (на основе a) на том, что несуществующей процессы являются все еще там и b) о том, что логика, которая возникает следующая, кажется, не выполнена.

Несовершенные процессы - это зомби, верно? Это значит, что они умерли, но не получили, правильно?

+0

[Does 'ps -el' говорят, что они зомби?] (Https://www.debian-administration.org/article/261/Finding_zombie_processes) Вы уверены, что пул завершил выполнение для всех элементов? –

+0

Это показывает, что они зомби (присутствует Z). – vmayer

+0

Должен ли я быть уверенным в выходе, прежде чем делать pool.close() или pool.join()? Честно говоря, я скопировал эту логику из примера и предположил, что пул закончил бы все предметы, прежде чем разрешить закрытие. – vmayer

ответ

0

Хотя я не понимаю его полностью, проблема заключалась в том, что я делал вызов sys.exit() из одного из моих дочерних процессов. Это неправильный способ выхода из дочернего процесса, а вместо этого следует вызывать os._exit(): stackoverflow.com/questions/19747371

sys.exit() делает кучу очистки сначала перед выходом: возможно он застрял, пытаясь выполнить некоторую часть этой очистки, и родительский процесс ожидал, чтобы присоединиться к ней.

Не стесняйтесь предоставлять дополнительные пояснения, и я могу отредактировать этот ответ.

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