Вы можете использовать пакет signal , если вы работаете в 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