Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,Try的超时,X秒后的语句除外?_Python_Error Handling_Timeout - Fatal编程技术网

Python,Try的超时,X秒后的语句除外?

Python,Try的超时,X秒后的语句除外?,python,error-handling,timeout,Python,Error Handling,Timeout,我一直在搜索这个问题,但似乎找不到确切的答案(大多数都会涉及到更复杂的事情,如多线程等),我只想做一些类似于Try的事情,除了语句,如果进程没有在X秒内完成,它将抛出异常 编辑:这是因为我使用的网站测试软件(selenium)的配置有时会导致挂起。它不会抛出错误,不会超时或执行任何操作,因此我无法捕获它。我想知道最好的方法是什么来确定这已经发生了,这样我就可以在我的应用程序中继续,所以我想我是否可以做一些类似的事情,“如果这还没有在X秒前完成…继续”如果没有某种多线程或多处理,你就无法做到这一点

我一直在搜索这个问题,但似乎找不到确切的答案(大多数都会涉及到更复杂的事情,如多线程等),我只想做一些类似于Try的事情,除了语句,如果进程没有在X秒内完成,它将抛出异常


编辑:这是因为我使用的网站测试软件(selenium)的配置有时会导致挂起。它不会抛出错误,不会超时或执行任何操作,因此我无法捕获它。我想知道最好的方法是什么来确定这已经发生了,这样我就可以在我的应用程序中继续,所以我想我是否可以做一些类似的事情,“如果这还没有在X秒前完成…继续”

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

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

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

while time <= some_value:

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

如果您使用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 

谢谢你的信息。。。我用我正在做的事情的信息更新了OP,这并不是说我不想使用多线程,只是我觉得我的情况有点不寻常(也许/希望不是),所以我想不出一个解决方案我不应该使用这样的例子,很抱歉混淆了。。。这并不是一个循环(我只是认为这会说明我尝试做什么,除了),我在帖子中添加了“编辑:”来解释我在做什么,这是一个外部过程,有时会挂起,因此无法提供反馈,所以我可以通过它。尽管你的帖子确实很有帮助,这让我想到了一种使用memcache/db解决方案来实现这一点的方法,在这种解决方案中,我为每个循环存储一个值并进行检查,这样我就知道它是否完成了,如果没有完成,我就用信号作为Python中的通用超时机制来杀死那个“小进程”是危险的。请参阅我的答案(顺便提一下,这是许多将错误答案标记为解决方案的问题之一)。当你说你在“使用网站测试软件”时,你的意思是你将其称为某种
系统
或管道,作为子进程,还是什么?(抱歉,如果这对熟悉selenium的人来说是显而易见的,我不是)好吧,它有自己为Python构建的API,所以它只是导入一些selenium Python类并从那里调用它,它的(selenium)不是Python应用程序,尽管它是用Javascript编写的感谢您的回答,这帮我指明了正确的方向,我认为这是使用进程并基于某些条件终止它(即,如果它没有使用指示它在一定时间内“完成”的值更新数据库),请不要对您自己的问题发表评论。请更新您的问题。如果您的更新包含您的所有评论,请删除无用和混乱的评论。请让问题本身完整。帮助我的是信号:第一个问题也是关于信号的,但很容易忽略。
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