我正在Python中调用一个函数,该函数可能会停滞并迫使我重新启动脚本。
如何调用该函数或将其包装在其中,以便如果花费的时间超过5秒,脚本将取消该函数并执行其他操作?
如果在UNIX上运行,则可以使用信号包:
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代码中拦截该异常。
alarm.alarm(10)
该模块不能很好地与线程配合使用(但是,谁可以呢?)
请注意,由于发生超时时会引发异常,因此该异常可能最终在函数内部被捕获并被忽略,例如一个这样的函数:
def loop_forever(): while 1: print('sec') try: time.sleep(10) except: continue