下面的代码尝试并行运行多个命令,每个命令都有一个超时。如果处理未在超时前完成,则将停止(我使用的是terminate()
问题是在终止(returncode设置为-ve)之后,communicate()方法挂起,当强制退出(Ctrl+C)时,将显示以下错误
(stdout, stderr) = proc.communicate()
File "python3.7/subprocess.py", line 926, in communicate
stdout = self.stdout.read()
procList = []
for app in appList:
try:
p = subprocess.Popen(app['command'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
procList.append((app, p))
except Exception as e:
print(e)
start = time.time()
while len(procList):
time.sleep(30)
try:
for app, proc in procList:
if (time.time() - start > app['timeoutSec']):
proc.terminate()
if proc.poll() is not None and app['mailSent'] == 0:
(stdout, stderr) = proc.communicate() #Hangs here is the process is terminated
send_results_mail('Execution Completed or Terminated')
app['mailSent'] = 1
except subprocess.SubprocessError as e:
print(e)
procList = [(app, proc) for (app, proc) in procList if app['mailSent'] == 0]
编辑:下面是一个工作示例,使用kill()处理一个行为不端的子进程(不会响应terminate()),但我不确定子进程的性质。希望这有助于您更接近解决方案
简单的子程序,Python 3:
修订了Python 3的父程序:
输出:
感谢所有的建议和回复,但没有解决任何问题,因为对我来说,我跨越的过程创建了多个层次的子过程
因此,我必须递归地终止进程,为此,我使用了使用
psutil
的解决方案详情请参阅下面的帖子
https://stackoverflow.com/a/27034438/2393961
一旦所有子进程和孙进程都被杀死
communicate()
就可以正常工作了我学到的另一件事是,尽管
htop
可以向您显示进程的树结构,但每个进程都是独立的,杀死父进程并不会自动杀死其死者。感谢我的朋友指出这一点相关问题 更多 >
编程相关推荐