Если вы просто используете subprocess.Popen
, все будет в порядке - вот как:
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()
Вы можете использовать .poll()
на объекте, возвращенном Попеном, чтобы проверить, завершен ли он (без ожидания). Если он возвращает None
, дочерний элемент все еще работает.
Убедитесь, что вы не сохраняете ссылки на объекты Popen - если вы это сделаете, они не будут собирать мусор, так что вы получите зомби. Вот пример:
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
В приведенном выше примере, если вы хотите избавиться от зомби, вы можете либо .wait()
на каждого из детей, либо .poll()
, пока результат не будет None
.
В любом случае все в порядке - либо без сохранения ссылок, либо с использованием .wait()
или .poll()
.