Убить дочерний процесс, если родитель убит на Python

Я создаю 5 различных процессов из python script, например:

p = multiprocessing.Process(target=some_method,args=(arg,))
p.start()

Моя проблема в том, что когда-то родительский процесс (главный script) убивается, дочерние процессы продолжают работать.

Есть ли способ убить дочерние процессы, которые появляются таким образом, когда родитель убит?

EDIT: Я пробую это:

p = multiprocessing.Process(target=client.start,args=(self.query_interval,))
p.start()
atexit.register(p.terminate)

Но это, похоже, не работает

Ответы

Ответ 1

Я столкнулся с одной и той же проблемой, у меня есть следующее решение:

перед вызовом p.start() вы можете установить p.daemon=True. Затем, как упоминалось здесь многопроцессор python.org

Когда процесс завершается, он пытается завершить все свои демонические дочерние процессы.

Ответ 2

Ребенок не уведомляется о смерти своего родителя, он работает только по-другому.

Однако, когда процесс умирает, все его файловые дескрипторы закрыты. И другой конец трубы уведомляется об этом, если он выбирает его для чтения.

Таким образом, ваш родитель может создать канал до появления процесса (или, фактически, вы можете просто настроить stdin как канал), и ребенок может выбрать это для чтения. Он будет сообщать о готовности к чтению, когда родительский конец закрыт. Это требует, чтобы ваш ребенок запускал цикл почты или, по крайней мере, делал регулярные вызовы для выбора. Если вы этого не хотите, для этого вам потребуется какой-то менеджерский процесс, но затем, когда он будет убит, все снова ломается.

Ответ 3

Вы можете завершить дочерний процесс при закрытии главного окна:

def close_window( ):
    p.terminate()
    window.destroy()