2012-08-13 12 views
11

lo esperado El método terminate() para matar a los dos procesos:¿Por qué los niños no mueren?

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 

Ejecución del código da:

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

que estaba esperando:

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

+1 para buena línea de cabeza. Podría ser el título de un disco de heavy metal. – log0

+4

El multiprocesamiento siempre hace estos comentarios incómodos sobre los niños moribundos convirtiéndose en zombis, matando a sus padres y esas cosas. Es tan genial xD – poke

Respuesta

7

Debido terminate función, es suficiente enviar la señal SIGTERM para procesar, pero signals are asynchronous, para que pueda dormir durante un tiempo, o wait para la terminación de procesos (recepción de señal).

Por ejemplo, si agrega la cadena time.sleep(.1) después de la terminación, es probable que se termine.

Cuestiones relacionadas