Почему дети не умеют умирать?

Я ожидал, что метод terminate() должен убить два процесса:

import multiprocessing
import time

def foo():
    while True:
        time.sleep(1)

def bar():
    while True:
        time.sleep(1)

if __name__ == '__main__':
    while True:
        p_foo = multiprocessing.Process(target=foo, name='foo')
        p_bar = multiprocessing.Process(target=bar, name='bar')
        p_foo.start()
        p_bar.start()
        time.sleep(1)
        p_foo.terminate()
        p_bar.terminate()
        print p_foo
        print p_bar

Запуск кода дает:

<Process(foo, started)>
<Process(bar, started)>
<Process(foo, started)>
<Process(bar, started)>
...

Я ожидал:

<Process(foo, stopped)>
<Process(bar, stopped)>
<Process(foo, stopped)>
<Process(bar, stopped)>
...

Ответ 1

Поскольку функция terminate просто посылает сигнал SIGTERM для обработки, но сигналы асинхронны, поэтому вы можете спать в течение некоторого времени или wait для завершения процессов (получение сигнала).

Например, если вы добавите строку time.sleep(.1) после завершения, она, вероятно, будет завершена.