Python终止子进程

2024-04-19 22:38:33 发布

您现在位置:Python中文网/ 问答频道 /正文

Python 2.7、Ubuntu 16.04

我们购买了一个专有的数学软件包,用于计算。我们正在尝试构建一个进程,该进程在运行10秒后终止该包的子进程

下面的解决方案在10秒后按预期终止do_math()函数。但是solve用它自己的pid启动一个子进程。因此,执行ps aux显示它以自己的名称运行,而不是以python名称运行

在python中,有没有任何方法可以跟踪并杀死以这种方式启动的pid

def do_math():
    status = solve() #launches the package

#Start function as a process
k = multiprocessing.Process(target=do_math)
k.start()

# Wait for 10 seconds or until process finishes
k.join(10)

# If thread is still active
if k.is_alive():
    print k.pid
    os.kill(k.pid, signal.SIGINT)

Tags: 方法函数名称进程isubuntu数学math
1条回答
网友
1楼 · 发布于 2024-04-19 22:38:33

假设solve函数正在做一些您无法更改的令人讨厌的事情,那么没有简单或干净的方法来做到这一点

一种可能是在自己的组中生成子级,然后对组进行核攻击……但是用multiprocessing进行管理并不是件小事,它甚至可能不起作用,这取决于solve如何启动子级

一个更黑客的方法,但可能更容易和更可能的工作,是手动走孩子的进程树,找到并杀死任何孙子之前或之后杀死孩子。最简单的方法可能是像^{}这样的第三方库。它看起来像这样:

# Shortly after launching k
p = psutil.Process(k.pid)

# Later, right before killing k
for child in p.children():
    p.send_signal(signal.SIGINT)

如果你想在孩子死后杀死他们(我假设你发送SIGINT而不是SIGTERM是有原因的,所以这可能很重要),你应该在杀死k之前先复制p.children()

相关问题 更多 >