Выполнять и контролировать несколько экземпляров внешней программы на Python - PullRequest
2 голосов
/ 26 октября 2009

Основная программа выглядит так:

PREPARE PARAMETERS FOR CHILD PROCESSES
subprocess.Popen('python child.py param=example1'.split(' '))
subprocess.Popen('python child.py param=example2'.split(' '))
...

Как заставить основную программу следить за каждым запущенным экземпляром дочернего процесса и перезапускать ее с соответствующими параметрами, если она не запущена.

Целью сохранения нескольких экземпляров дочернего процесса вместо реализации многопоточной архитектуры внутри основного процесса является максимально возможное использование пропускной способности ЦП и базы данных.

1 Ответ

5 голосов
/ 26 октября 2009

Сохраняйте dict с .pid s дочерних процессов в качестве ключей, а командные строки перезапускают их как соответствующие значения. i.e.:

childid = []
for cmdline in cmdlines:
  p = subprocess.Popen(cmdline.split())
  childid[p.pid] = cmdline

os.wait будет возвращаться всякий раз, когда завершается любой дочерний процесс: он дает вам (pid, exitstatus) дочернего процесса. Так что просто перезапустите и сохраните childid. i.e.:

while mustcontinue:
  pid, exitstat = os.wait()
  cmdline = childid.pop(pid)
  p = subprocess.Popen(cmdline.split())
  childid[p.pid] = cmdline

Предположительно, у вас есть несколько критериев, когда этот бесконечный цикл заканчивается, я просто использовал mustcontinue в качестве названия для этих критериев здесь; -).

...