有人可以帮助我了解timeout参数在子流程模块中如何工作,以及如何正确使用subprocess.TimeoutExpired异常吗?
我的用例是我有一个主运行程序,该程序运行子进程作为其重复例程的一部分。子进程有时会挂起。我想防止这种情况拖延一切。
我以为我可以使用timeout参数给孩子运行这么长时间。但是,在下面的示例程序中,行为不是我所期望的。运行parent.py时,它确实启动child.py,我可以看到child.py的输出计数了。4s之后,parent.py确实获得了subprocess.TimeoutExpired异常,但是child.py的输出不断出现。这使我相信child.py进程实际上并未被杀死。文档似乎暗示它将被杀死:
超时参数传递给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)
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)
看来您需要添加通话
p.terminate()
在sys.exit
父进程之前-根据当前文档(https://docs.python.org/3/library/subprocess.html#subprocess.Popen),您引用的位仅适用于subprocess.call
,而不是您使用的位这里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句