有人可以帮我理解超时参数如何在子进程模块中工作,以及如何正确使用subprocess.TimeoutExpired异常?
我的用例是我有一个主流程序,它运行子进程作为其重复例程的一部分.众所周知,子进程会不时挂起.我想防止这种情况持续下去.
我以为我可以使用timeout参数给孩子这么长的时间来运行.但是,在我的示例程序中,行为不符合我的预期.运行parent.py时,它会启动child.py,我可以看到child.py的输出计数.4s之后,parent.py确实得到了subprocess.TimeoutExpired异常,但是child.py的输出仍然存在.这让我相信child.py进程实际上并没有被杀死.文档似乎表明它会被杀死但是:
timeout参数传递给Popen.wait().如果超时到期,子进程将被终止,然后再次等待.子进程终止后,将重新引发TimeoutExpired异常.
那么我怎么能完成这个问题呢?当我收到超时异常时,我是否需要以某种方式杀死我的子进程?
谢谢您的帮助.
parent.py
#!/usr/bin/env python3
import os
import sys
import subprocess
p = subprocess.Popen("/path/to/python3 /path/to/child.py", shell=True)
try:
p.wait(timeout=4)
except subprocess.TimeoutExpired:
print("we got a timeout. exiting")
sys.exit(1)
Run Code Online (Sandbox Code Playgroud)
child.py
#!/usr/bin/env python3
import os
import sys
import time
for i in range(200):
print("i is {}".format(i))
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
看来您确实需要添加一个调用:
p.terminate()
Run Code Online (Sandbox Code Playgroud)
sys.exit根据当前文档,在您的父进程中之前,您引用的位仅适用于subprocess.call,而这不是您在此处使用的内容。