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()
我有一个 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()