Ответ 1
Когда процесс завершается, он пытается завершить все свои демонические дочерние процессы.
Ключевым словом здесь являются "попытки". Кроме того, "выходы".
В зависимости от вашей платформы и реализации может быть, что единственный способ получить дочерние дочерние процессы - это сделать это явно. Если родительский процесс завершается нормально, он получает возможность сделать это явно, поэтому все в порядке. Но если родительский процесс прерывается резко, это не так.
В частности, для CPython, если вы посмотрите на источник, завершающие демонические процессы обрабатываются так же, как объединение не-демонических процессов: по ходьба active_children()
в функции atexit
. Таким образом, ваши демоны будут убиты тогда и только тогда, когда ваши обработчики atexit
будут запущены. И, как говорится в этом модуле,
Примечание: функции, зарегистрированные через этот модуль, не вызывают, когда программа убивается сигналом, который не обрабатывается Python, когда обнаружена фатальная внутренняя ошибка Python или когда вызывается
os._exit()
.
В зависимости от того, как вы убиваете родителя, вы можете обойти это, добавив обработчик сигнала, чтобы перехватить внезапное завершение. Но вы не можете, например, на POSIX, SIGKILL
не перехватываться, поэтому, если вы kill -9 $PARENTPID
, это не вариант.
Другой вариант - убить группу процессов, а не только родительский процесс. Например, если ваш родитель имеет PID 12345, kill -- -12345
в linux убьет его и всех его дочерних элементов (если вы не сделали ничего интересного).