我有一个包含队列中某些项目的c ++应用程序,然后这些项目将由python脚本处理。我想要它,以便最多运行10个python脚本实例。我计划使用execl()来启动python进程,有没有办法告诉进程已经退出而不必将消息传递回父进程?
答案 0 :(得分:5)
execl
不启动进程 - 它使用另一个可执行文件覆盖现有进程。 fork
确实启动一个进程 - 并将子进程的id(又名pid
)返回给父进程(返回0到子进程,这就是孩子知道它的方式)孩子,所以它可以清理和exec
)。使用孩子的pid
来检查他们是否已经完成,或者使用SIGCHLD来跟踪这些内容。
我推荐SIGCHLD
所以你不必“轮询”以查看某个进程是否已经终止,但后一种方法也不是太难 - 只需执行一次:
def whosdone(pids):
nope = []
done = []
for pid in pids:
try: os.kill(pid, 0)
except OSError: nope.append(pid)
else: done.append(pid)
return done, nope
即。您可以定期调用done, pidslist = whosdone(pidslist)
并对完成的PID做任何您需要做的事情。当然,当你fork
时,请使用成语:
pid = os.fork()
if pid: # we're the parent process
pidslist.append(pid)
else: # we're the child process
# clean things up, etc, then exec
答案 1 :(得分:0)
如果您在unix / linux下使用C ++执行此操作,请查看wait(), waitpid(), waitid(),wait3(), or wait4()。您可以调用waitpid()NOHANG(轮询)或阻止它直到子进程完成。 Pid(process-id)是fork().
返回的值I did a painful "hard way" example of fork() earlier (using dup2() to re-route IO).