【问题标题】:What is the proper way to try / except a timeout in Python尝试/除了Python中的超时的正确方法是什么
【发布时间】:2018-03-19 17:08:14
【问题描述】:

服务器升级后,我遇到了一个 python 脚本占用所有服务器连接的问题,因为它似乎在超时后实际上并没有结束循环。代码如下:

if os.name == 'posix':
    signal.signal(signal.SIGALRM, self.handle_timeout)
    signal.alarm(__TIMEOUT__)
try:
    self.inputline = self.rfile.readline()
except IOError:
    continue
if os.name == 'posix':
    signal.alarm(0)

信号发生后,所做的只是将terminated 变量设置为1 并打印有关超时的日志。 while 看起来像 while not self.terminated:。我的猜测是,因为它有except IOError:,所以不会出现异常,它仍然位于readline() 上。所以问题是,确保SIGALRM 会导致continue 结束循环并退出脚本的正确方法是什么?

TIA!!

【问题讨论】:

  • 请修正您的代码缩进。
  • continue 确实 not 结束循环。它继续。您正在寻找break
  • 正确,但循环由警报信号设置的变量控制,因此只有在超时时循环才会结束。
  • 剩下的代码在哪里?

标签: python


【解决方案1】:

handle_timeout() 中,您可以引发异常以唤醒您的try。然后在您的 try/except 中捕获该异常:

def handle_timeout(signum, frame):
    raise KeyboardInterrupt('received signal to exit')

while not terminated:
    try:
        self.inputline = self.rfile.readline()
    except IOError, KeyboardInterrupt:
        terminated = True
        continue

【讨论】:

  • 另外,如果你在你的信号处理函数中设置terminated = True,你需要声明它global
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
相关资源
最近更新 更多