python 子进程:在 child 终止的信号处理程序中找出

python subprocess: find out in the signal handler which child terminated

我有一个 python 脚本,它使用 subprocess.Popen 启动多个命令。我添加了一个信号处理程序,如果 child 退出则调用它。我想检查哪个 child 终止了。我可以通过遍历所有 children:

来做到这一点
#!/usr/bin/env python
import subprocess
import signal

procs = []

def signal_handler(signum, frame):
    for proc in procs:
        proc.poll()
        if proc.returncode is not None:
            print "%s returned %s" % (proc.pid, proc.returncode)
            procs.remove(proc)

def main():
    signal.signal(signal.SIGCHLD, signal_handler)
    procs.append(subprocess.Popen(["/bin/sleep", "2"]))
    procs.append(subprocess.Popen(["/bin/sleep","5"]))
    # wait so the main process does not terminate immediately
    procs[1].wait()

if __name__ == "__main__":
    main()

我想避免查询所有子进程。有没有办法在信号处理程序中确定哪个 child 终止了?

如果您不想产生额外的进程,则可以使用 multiprocessing. You could use the threading 包来实现类似的结果。它具有几乎完全相同的界面。基本上,每个 subprocess 调用都发生在一个新进程中,然后启动您的 sleep 进程。

import subprocess
import multiprocessing

def callback(result):
    # do something with result
    pid, returncode = result
    print pid, returncode


def call_process(cmd):
    p = subprocess.Popen(cmd)
    p.wait()
    return p.pid, p.returncode


def main():
    pool = multiprocessing.Pool()
    pool.apply_async(call_process, [["/bin/sleep", "2"]], callback=callback)
    pool.apply_async(call_process, [["/bin/sleep", "5"]], callback=callback)
    pool.close()
    pool.join()


main()