【问题标题】:Python, Timeout of Try, Except Statement after X number of seconds?Python,尝试超时,X 秒后的语句除外?
【发布时间】:2011-04-18 04:10:40
【问题描述】:

我一直在寻找这个,但似乎无法找到一个确切的答案(大多数会涉及更复杂的事情,如多线程等),我只想做一些类似 Try, 除了声明如果进程没有'没有在 X 秒内完成会抛出异常。

编辑:这样做的原因是我正在使用一个网站测试软件 (selenium),其配置有时会导致它挂起。它不会抛出错误,不会超时或做任何事情,所以我无法捕捉到它。我想知道最好的方法是确定这种情况已经发生,这样我就可以在我的应用程序中继续前进,所以我在想我是否可以做类似的事情,“如果这还没有在 X 秒内完成......继续前进” .

【问题讨论】:

  • 当你说你“使用一个网站测试软件”时——你的意思是你用某种system 或管道调用它,作为一个子进程,还是什么? (对不起,如果这对于熟悉硒的人来说很明显,我不是)
  • 好吧,它有自己为 Python 构建的 API,所以它只是导入一些 Selenium python 类并从那里调用它,它的 (selenium) 不是 python 应用程序,虽然它是用 javascript 编写的
  • 感谢您的回答,这帮助我指出了正确的方向,我认为这是使用进程并根据某些条件将其终止(即,如果它不更新数据库一个值,表明它在一定时间内“完成”)
  • 请不要评论您自己的问题。请更新您的问题。如果您的更新包括您所有的 cmets,请删除无用和混乱的 cmets。请完成问题本身。
  • 对我有帮助的是信号:stackoverflow.com/questions/492519/timeout-on-a-function-call 第一个链接的问题也是关于信号的,但很容易忽略。

标签: python error-handling timeout


【解决方案1】:

如果没有某种多线程或多处理,即使它隐藏在某些抽象层下,你也无法做到这一点,除非你正在运行的“进程”是专门为异步设计的,并且一次回调已知函数过一会儿。

如果您描述了该过程的实际情况,则更容易提供真正的解决方案。我认为您不会欣赏 Python 在实现简洁而完整方面的强大功能。即使使用多线程/多处理,这也可能只需要几行代码即可实现。

【讨论】:

  • 感谢您提供的信息...我更新了 OP 并提供了有关我在做什么的信息,并不是我不想使用多线程,只是我认为我的情况有点不寻常(也许/ 希望不是?)所以我想不出解决方案
【解决方案2】:

如果您使用的是 UNIX,则为通用解决方案:

import time as time
import signal

#Close session
def handler(signum, frame):
    print 1
    raise Exception('Action took too much time')


signal.signal(signal.SIGALRM, handler)
signal.alarm(3) #Set the parameter to the amount of seconds you want to wait

try:
    #RUN CODE HERE

    for i in range(0,5):
        time.sleep(1)
except:
    print 2

signal.alarm(10) #Resets the alarm to 10 new seconds
signal.alarm(0) #Disables the alarm 

【讨论】:

    【解决方案3】:

    答案(和问题)并不特定于 try/except 语句。如果您想要一个不是无限的无限循环(但会在一段时间后停止),它可能不应该是无限的。例如,将其更改为使用:

    while time <= some_value:
    

    或者在循环体中添加一个额外的检查,让它在你希望它停止时中断:

    while True:
        ...
        if time > some_value:
            break
    

    如果这不可能(例如,因为您根本无法控制循环),事情就会变得更加困难。在许多系统上,您可以使用signal.alarm 在一段时间后传递信号,然后使用signal.SIGALRM 的信号处理程序引发TimeoutError 异常。根据无限循环的实际作用,这可能会或可能不会起作用;如果它阻塞信号,或者捕获并忽略异常,或者以任何其他方式干扰信号处理程序,那将不起作用。另一种可能性是不在当前流程中执行循环,而是在单独的流程中执行;然后,您可以随心所欲地终止单独的过程。但是,除了终止它之外,做任何事情都不容易,因此清理或恢复部分工作非常困难。 (线程根本不会工作,因为没有办法中断执行无限循环的单独线程。)

    【讨论】:

    • 我不应该使用这样的例子,很抱歉造成混乱......它并不是真正的循环(我只是认为这可以说明我试图用 Try 做什么,除了),我在帖子中添加了“编辑:”以解释我在做什么,它是一个有时会挂起的外部进程,因此它无法提供反馈,因此我可以跳过它
    • 不过,您的帖子确实很有帮助,它让我想到了一种使用 memcache / db 解决方案来做到这一点的方法,在该解决方案中,我为每个循环存储一个值并检查它,以便我知道它是否完成与否,如果不是,我只是杀死那个“迷你进程”
    • 在 Python 中使用信号作为通用超时机制是危险的。在stackoverflow.com/questions/366682 上查看我的答案(顺便说一下,SO 问题将错误答案标记为解决方案的众多示例之一)。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多