Si usted utiliza simplemente subprocess.Popen
, se le multa - He aquí cómo:
import subprocess
def spawn_some_children():
subprocess.Popen(["sleep", "3"])
subprocess.Popen(["sleep", "3"])
subprocess.Popen(["sleep", "3"])
def do_some_stuff():
spawn_some_children()
# do some stuff
print "children went out to play, now I can do my job..."
# do more stuff
if __name__ == '__main__':
do_some_stuff()
Usted puede utilizar .poll()
en el objeto devuelto por Popen para comprobar si se terminó (sin tener que esperar). Si devuelve None
, el hijo aún se está ejecutando.
Asegúrate de no guardar referencias a los objetos de Popen; si lo haces, no serán basura, por lo que terminas con zombies. He aquí un ejemplo:
import subprocess
def spawn_some_children():
children = []
children.append(subprocess.Popen(["sleep", "3"]))
children.append(subprocess.Popen(["sleep", "3"]))
children.append(subprocess.Popen(["sleep", "3"]))
return children
def do_some_stuff():
children = spawn_some_children()
# do some stuff
print "children went out to play, now I can do my job..."
# do more stuff
# if children finish while we are in this function,
# they will become zombies - because we keep a reference to them
En el ejemplo anterior, si usted quiere deshacerse de los zombies, puede .wait()
en cada uno de los hijos o .poll()
hasta que el resultado no es None
.
De cualquier manera está bien - o bien no guardando referencias, o usando .wait()
o .poll()
.
Gracias por su comentario. Sin pretenderlo, la comunicación espera a que los procesos se completen antes de generar uno nuevo. Necesito ejecutar procesos numéricos en paralelo. – Dave
call() espera a que finalice el proceso. Creo que OP quiere generar procesos y hacer algo más en el proceso principal mientras se ejecutan. – ibz
Con 'Popen.poll()' puede verificar si el proceso ha finalizado, entonces puede usar 'communicate'. De esta manera puede mantener la concurrencia. –