如何在python中超时一个语句/代码块?
我尝试使用以下查看帖子,但无法识别信号:
wls:/offline> import signal
Traceback (innermost last):
File "<console>", line 1, in ?
ImportError: no module named signal
代码:
import os
import signal
def handler(signum, frame):
print "Forever is over!"
raise Exception("end of time")
def loop_forever():
import time
while 1:
print "sec"
time.sleep(1)
signal.signal(signal.SIGALRM, handler)
signal.alarm(10)
try:
loop_forever()
except Exception, exc:
print exc
答案 0 :(得分:4)
您的代码对我来说非常有效:
>>> import os
>>> import signal
>>>
>>> def handler(signum, frame):
... print "Forever is over!"
... raise Exception("end of time")
...
>>> def loop_forever():
... import time
... while 1:
... print "sec"
... time.sleep(1)
...
>>> signal.signal(signal.SIGALRM, handler)
0
>>> signal.alarm(10)
0
>>>
>>> try:
... loop_forever()
... except Exception, exc:
... print exc
...
sec
sec
sec
sec
sec
sec
sec
sec
sec
sec
Forever is over!
end of time
但是,您使用的是Unix系统吗?无论是Linux,BSD还是Mac?信号模块可能根本不存在于其他操作系统上,因为这是使用非常特定于unix系统的功能,即使Windows确实对POSIX进程有非常基本的支持。
编辑:嗯,因为我说的是一个非常特殊的情况,既不是Unix,也不是windows甚至是symbian;但是你在Jython中运行它,它没有访问操作系统功能,而缺少signal
模块。您应该使用Jython标记您的问题,以帮助我们更有效地帮助您!那么你最好使用一个线程计时器,它应该在Jython中很好地实现。
作为一个非常基本的例子:
>>> threading.Timer(5.0, lambda: print("toto")).start()
作为一个更复杂的例子,我使用一个简单的锁信号量来处理 主线程和计时器线程之间的信号:
>>> import time
>>> import threading
>>> l = threading.Lock()
>>> threading.Timer(5.0, lambda l: l.acquire(), args=(l,)).start()
>>> while not l.locked():
... print("sec")
... time.sleep(1)
...
sec
sec
sec
sec
sec
>>>
答案 1 :(得分:0)
这似乎有效
超时后调用方法:
from threading import Timer
import time
def timeout():
print 'in timeout'
def main():
print 'it keeps going and going ',
while 1:
print 'and going '
time.sleep(3)
try:
Timer(5.0,timeout).start()
main()
except:
print "whoops"