[Windows,python]如何使由subprocee.Popen()启动的进程在父进程终止时自动终止?

时间:2019-12-10 06:36:55

标签: python windows subprocess

在我的python脚本中,我使用以下命令开始了一些过程:

@Column(name="status")
private String status = "confirmed";

当这两个子进程启动时,当父进程死于某些错误时,它们不会被杀死。
我希望这三个进程(父进程p1和p2)同时退出。那就是它们中的任何一个都终止了,而其他所有都终止了。如何在 Windows 上管理它?那 Linux 呢?

1 个答案:

答案 0 :(得分:1)

假设父进程即将死于异常(而不是像分段错误这样的硬错误),简单的try / finally可以保证在退出该块时终止进程(通过执行从头开始,异常冒出来,return尽早离开函数,等等):

p1 = p2 = None  # Ensure names exist
try:
    p1 = subprocess.Popen('p1.exe')
    p2 = subprocess.Popen('p2.exe')
    # ... stuff that runs in tandem with processes

finally:
    for p in (p1, p2):
        if p is not None:
            p.terminate()

如果您希望子进程更干净地关闭,则简单的with语句就足够了(std句柄将关闭,您将等待每个进程):

with subprocess.Popen('p1.exe') as p1, subprocess.Popen('p2.exe') as p2:
    # ... stuff that runs in tandem with processes

如果要启动进程并在父进程启动时一直运行,则应使用the atexit module注册它们以在主进程退出时终止:

import atexit

p1 = subprocess.Popen('p1.exe')
atexit.register(p1.terminate)
p2 = subprocess.Popen('p2.exe')
atexit.register(p2.terminate)
# ... rest of your code