[英]How to timeout a statement
如何使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
您的代码对我来说运行良好:
>>> 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? 尽管Windows确实对POSIX进程提供了非常基本的支持,但其他OS上可能根本没有信号模块,因为它使用的是Unix系统特有的功能。
编辑:好吧,正如我所说的,您的情况非常特殊,既不是Unix也不是Windows,甚至不是symbian; 但是您正在Jython中运行它,它无法访问OS功能,但是缺少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
>>>
这似乎正在工作
超时后调用方法:
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"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.