我正在实现python程序,它返回子进程的结果(比如'ls')。 子流程具有订阅连续输出等功能,更具体,订阅两个结果,两个结果之间存在短期(约1秒)。
所以,我设计了一个类似下面的类来订阅输出。
class Subscribe:
def __init__(self, sec):
self.m_sec = sec
def subscribeResult(self, p):
self.m_timeout = False
signal.signal(signal.SIGALRM, self.handleTimeout)
signal.alarm(self.m_sec)
returnValue = ""
try:
with p.stdout:
for line in iter(p.stdout.readline, b''):
if self.m_timeout:
signal.alarm(0)
p.kill()
return "timeout"
returnValue += line
p.stdout.close()
p.wait()
exception Exception, inst:
print inst
signal.alarm(0)
p.kill()
return "except"
signal.alarm(0)
rv = returnValue.strip()
if rv == "":
return "null"
return rv
def handleTimeout(self, signum, frame):
self.m_timeout = True
它运行良好,但很少引发IO异常,如下所示。 :IOError:[Errno 4]系统调用中断
代码中有弱点吗? 请告诉我如何删除异常
答案 0 :(得分:0)
在大多数情况下,只需重试您正在执行的任何系统调用,例如,subprocess
模块有一个辅助函数来忽略EINTR
错误:
def _eintr_retry_call(func, *args):
while True:
try:
return func(*args)
except (OSError, IOError) as e:
if e.errno == errno.EINTR:
continue
raise
用法:
readline = _eintr_retry_call(p.stdout.readline)
在Python 3.5中,它会自动发生。请参阅PEP 0475 -- Retry system calls failing with EINTR。