многопроцессорность Python: уведомить родителя, когда ребенок будет убит

Я пытаюсь сымитировать сценарий, в котором ребенок, порожденный многопроцессорным пулом python, погибает. Подпроцесс никогда не возвращается, но я хотел бы, чтобы родитель получал уведомление в таком сценарии. Я использую тестовый код:

import multiprocessing as mp
import time
import os
result_map = {}

def foo_pool(x):
    print x,' : ',os.getpid()
    pid = os.getpid()
    if x == 1:
        os.kill(pid,9)
    return x


result_list = []
def log_result(result):
    print 'callback',result


def apply_async_with_callback():
    print os.getpid()
    pool = mp.Pool()
    for i in range(2):
        result_map[i] = pool.apply_async(foo_pool, args = (i, ),     callback = log_result)
    pool.close()
    pool.join()

    for k,v in result_map.iteritems():
        print k,' :    ',v.successful()

    print(result_list)


if __name__ == '__main__':
    apply_async_with_callback()

person ishu    schedule 25.01.2015    source источник
comment
Я не уверен, что вы идете правильным путем. Если у вас есть мероприятие и вы хотите его опубликовать, используйте multiprocesing.Event. Если дочерний элемент по какой-то причине убит, попробуйте установить соответствующий обработчик сигнала, чтобы уведомить родителя о сигнале, который его убил.   -  person Reut Sharabani    schedule 25.01.2015


Ответы (1)


Пул процессов не предоставляет никакого механизма для уведомления родительского процесса о завершении дочернего процесса.

Такие проекты, как бильярд или pebble может сделать то, что вы ищете.

Имейте в виду, что нет никакого способа перехватить сигнал SIGKILL, поэтому использование обработчиков сигналов бессмысленно.

person noxdafox    schedule 08.02.2015
comment
Использование обработчиков сигналов бессмысленно в дочернем, но не в родительском, который может использовать SIGCHLD, чтобы узнать, завершился ли дочерний процесс по какой-либо причине. - person user4815162342; 17.02.2015
comment
SIGCHLD поддерживается не всеми операционными системами. Более того, многие реализации SIGCHLD в Unix имеют тенденцию объединять несколько сигналов, что затрудняет определение того, какой процесс умер и когда. - person noxdafox; 05.07.2015
comment
@noxdafox wait() сообщает вам, какой ребенок умер. - person aaa90210; 12.05.2016
comment
wait() не переносим, ​​так как не поддерживается в Windows. Более того, Python не предоставляет такой API для процессов. - person noxdafox; 12.05.2016