Чтобы подвести итог и продолжить обсуждение в комментариях к другому ответу:
Почему родительский (основной) процесс должен быть активным после завершения выполнения?Обратите внимание, что родитель не выполняет join
для p
.
multiprocessing
, чтобы убедиться, что ваши программы, использующие его, работают хорошо.То есть он пытается убирать за собой.Для этого используется модуль atexit
, который позволяет регистрировать обработчики выхода, которые должны выполняться, когда процесс интерпретатора готовится завершиться нормально.
multiprocessing
определяет и регистрирует функцию_exit_function
, который сначала вызывает terminate()
для всех все еще работающих демонических потомков, а затем вызывает join()
для всех оставшихся недемонических дочерних объектов.Так как join()
блоков, родитель ждет, пока не-демонические дочерние элементы будут завершены.terminate()
, с другой стороны, не блокирует, он просто отправляет сигнал SIGTERM
(в Unix) childs и возвращает.
Это приводит нас к:
Почему ребенок-демон p1
должен стать зомби через 1 секунду?Обратите внимание, что родительский (основной) процесс фактически остается активным до тех пор, пока не будет запущено p
.
Это потому, что родительский процесс достиг конца своих инструкций, и интерпретатор готовится завершить его, т.е.выполняет зарегистрированные обработчики выхода.Демон-ребенок p1
получает сигнал SIGTERM
.Поскольку SIGTERM
разрешено отлавливать и обрабатывать внутри процессов, дочернему элементу не приказано немедленно завершать работу, но вместо этого ему предоставляется возможность выполнить некоторую собственную очистку.Вот что заставляет p1
отображаться как <defunct>
.Ядро знает, что процесс получил команду на завершение, но процесс еще не сделал этого.
В данном случае у p1
еще не было возможности выполнить сигнал SIGTERM
, возможно потому, что он все ещевыполняет sleep()
.По крайней мере, начиная с Python 3.5 :
Теперь функция спит не менее секунд , даже если сон прерывается сигналом, за исключением случая, когда обработчик сигналавозникает исключение (см. PEP 475 для обоснования).