在Python中执行和监视外部程序的多个实例

jac*_*ack 2 python external-process

主程序是这样的:

PREPARE PARAMETERS FOR CHILD PROCESSES
subprocess.Popen('python child.py param=example1'.split(' '))
subprocess.Popen('python child.py param=example2'.split(' '))
...
Run Code Online (Sandbox Code Playgroud)

如何使主程序监视它启动的子进程的每个实例,如果它没有运行,则使用相应的参数重新启动它.

保持多个子进程实例运行而不是在主进程中实现多线程架构的目的是尽可能多地利用CPU和数据库吞吐量.

Ale*_*lli 5

使用.pid子进程的s作为键保持dict ,并使用命令行将它们作为相应的值重新启动.即:

childid = []
for cmdline in cmdlines:
  p = subprocess.Popen(cmdline.split())
  childid[p.pid] = cmdline
Run Code Online (Sandbox Code Playgroud)

只要有任何子进程终止,os.wait就会返回:它给你(孩子的pid,exitstatus).所以只需适当重新启动并维护childid.即:

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

大概你有这个无限循环结束时的一些标准,我只是mustcontinue在这里用作这些标准的名称;-).