【发布时间】:2010-11-02 18:14:09
【问题描述】:
我有一个 C++ 应用程序,其中包含队列中的某些项目,然后这些项目将由 python 脚本处理。我希望它最多运行 10 个 python 脚本实例。我打算使用 execl() 来启动 python 进程,有没有办法告诉进程已经退出而不必将消息传递回父进程?
【问题讨论】:
我有一个 C++ 应用程序,其中包含队列中的某些项目,然后这些项目将由 python 脚本处理。我希望它最多运行 10 个 python 脚本实例。我打算使用 execl() 来启动 python 进程,有没有办法告诉进程已经退出而不必将消息传递回父进程?
【问题讨论】:
execl 不启动进程——它用另一个可执行文件覆盖现有进程。 fork 确实启动了一个进程——并将子进程的 id(又名pid)返回给父进程(返回 0 给子进程,这就是子进程知道它是子进程的方式,所以它可以清理东西和exec)。使用孩子们的pids 来检查他们是否完成了,或者诱捕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
【讨论】:
如果您在 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).
【讨论】: