python multiprocessing: Уведомете родителя, когато детето бъде убито

Опитвам се да емулирам сценарий, при който детето, породено от мултипроцесорния пул на 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 не се поддържа от всички операционни системи. Освен това много Unix реализации на SIGCHLD са склонни да агрегират множество сигнали, което прави по-трудно откриването кой процес е умрял и кога. - person noxdafox; 05.07.2015
comment
@noxdafox wait() ви казва кое дете е починало. - person aaa90210; 12.05.2016
comment
wait() не е преносим, ​​тъй като не се поддържа в Windows. Освен това Python не излага такъв API за процеси. - person noxdafox; 12.05.2016