Python-函数调用超时

我正在Python中调用一个函数,该函数可能会停滞并迫使我重新启动脚本。

如何调用该函数或将其包装在其中,以便如果花费的时间超过5秒,脚本将取消该函数并执行其他操作?

回答:

如果在UNIX上运行,则可以使用信号包:

In [1]: import signal

# Register an handler for the timeout

In [2]: def handler(signum, frame):

...: print("Forever is over!")

...: raise Exception("end of time")

...:

# This function *may* run for an indetermined time...

In [3]: def loop_forever():

...: import time

...: while 1:

...: print("sec")

...: time.sleep(1)

...:

...:

# Register the signal function handler

In [4]: signal.signal(signal.SIGALRM, handler)

Out[4]: 0

# Define a timeout for your function

In [5]: signal.alarm(10)

Out[5]: 0

In [6]: try:

...: loop_forever()

...: except Exception, exc:

...: print(exc)

....:

sec

sec

sec

sec

sec

sec

sec

sec

Forever is over!

end of time

# Cancel the timer if the function returned before timeout

# (ok, mine won't but yours maybe will :)

In [7]: signal.alarm(0)

Out[7]: 0

调用后10秒钟,将调用alarm.alarm(10)处理程序。这引发了一个异常,你可以从常规Python代码中拦截该异常。

该模块不能很好地与线程配合使用(但是,谁可以呢?)

请注意,由于发生超时时会引发异常,因此该异常可能最终在函数内部被捕获并被忽略,例如一个这样的函数:

def loop_forever():

while 1:

print('sec')

try:

time.sleep(10)

except:

continue

以上是 Python-函数调用超时 的全部内容, 来源链接: utcz.com/qa/429467.html

回到顶部