需要在不通信的情况下避免子进程死锁 [英] Need to avoid subprocess deadlock without communicate

查看:30
本文介绍了需要在不通信的情况下避免子进程死锁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一个EXECUTE命令,该命令会产生大量输出并花费大量时间执行(>30分钟)。我在考虑使用子进程。打开去做。我需要捕获该命令的输出,因此我将管道传递给stdout和stderr。

使用Popen.Wait()时的死锁问题在很多论坛上都有很好的文档记录,因此Popen.Communication()是建议的避免死锁的方法。该解决方案的问题是Communication()会阻塞,直到命令完成。在执行命令时,我需要打印到达标准输出的所有内容。如果20分钟后没有输出,脚本执行将被终止。

以下是我需要遵守的一些约束:

  • 我的Python版本是2.4.2,无法升级。
  • 如果解决方案仍然使用子进程,我需要将subprocess.PIPE传递给所有STD句柄以避免此错误:http://bugs.python.org/issue1124861

有办法吗?

推荐答案

import os
from subprocess import PIPE, STDOUT, Popen

lines = []
p = Popen(cmd, bufsize=1, stdin=open(os.devnull), stdout=PIPE, stderr=STDOUT)
for line in iter(p.stdout.readline, ''):
      print line,          # print to stdout immediately
      lines.append(line)   # capture for later
p.stdout.close()
p.wait()

这篇关于需要在不通信的情况下避免子进程死锁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆