【发布时间】:2014-10-29 17:44:28
【问题描述】:
我正在尝试实现一个函数,如果它无法在一定时间内完成(线程挂起问题),它将超时。这个answer 似乎是最有前途的,它有效地提供了一个API 包装器来调用我的实际函数。它通常似乎可以工作(请参阅 loop_forever),但是当我使用 time.sleep 时无法停止。为什么超时不适用于睡眠定时器,这是否可以作为防止线程挂起的一种方式?
import signal
import time
def timeout(func, args=(), kwargs={}, timeout_duration=1, default=None):
class TimeoutError(Exception):
pass
def handler(signum, frame):
raise TimeoutError()
# set the timeout handler
signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout_duration)
try:
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
finally:
signal.alarm(0)
return result
def loop_forever():
x = 0
while True:
print x
try:
x += 1
except:
continue
def loop_forever_sleep():
x = 0
while True:
print x
try:
x += 1
time.sleep(10)
except:
continue
if __name__ == '__main__':
a = timeout(loop_forever) #Terminates
b = timeout(loop_forever_sleep) #Does not terminate
【问题讨论】:
-
你的目标是什么平台?
-
这是在Linux上,我知道这个功能在Windows上不起作用。
标签: python multithreading timeout