如何超时声明

时间:2014-05-08 12:22:56

标签: python python-2.7 jython wlst

如何在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

2 个答案:

答案 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"