Python 如何使语句超时

Python 如何使语句超时,python,python-2.7,jython,wlst,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 >&

如何在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)
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中运行它,它没有操作系统功能,而缺少
信号
模块。你应该用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
>>> 

您的代码对我来说运行良好:

>>> 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中运行它,它没有操作系统功能,而缺少
信号
模块。你应该用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"

这似乎奏效了

它在超时后调用一个方法:

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"


使用线程不是更容易做到吗?你在什么操作系统上运行这个?以上内容应适用于基于UNIX的
system@RiccardoCagnasso不一定,线程并不总是python中的最佳选择。这个片段对我来说非常容易;-)我观察到的一件事是,如果我以python脚本的形式运行它,它就可以正常工作。如果我使用java/WLST运行它,它就不能正常工作。使用线程不是更容易做到这一点吗?您在什么操作系统上运行它?以上内容应适用于基于UNIX的
system@RiccardoCagnasso不一定,线程并不总是python中的最佳选择。这个片段对我来说非常容易;-)我观察到的一件事是,如果我以python脚本的形式运行它,那么它就可以正常工作。如果我使用java/WLST运行它,它就不会识别信号
signal
,因为Windows上有一个模块可用,它只限于可能信号的一小部分。文档指定了平台上的可用项,这就是为什么我使用modal
may
并添加了“即使windows对POSIX进程有非常基本的支持”;-)我观察到的一件事是,如果我以python脚本的形式运行它,那么它就可以正常工作了。如果我使用java/WLST运行它,那么它就不能很好地识别信号,正如我所说的,您处于一个非常特殊的情况下,既不是Unix也不是windows,但是您在Jython中运行它,Jython没有访问OS功能的权限,而缺少
信号
模块。那么你最好使用一个线程计时器,它应该在Jython中得到很好的实现。@zmo确实,这是我的观点<代码>信号
应该在Windows上可用,因此它不会解释导入错误
。但是,如果Jython不能传递信号,因此没有实现
信号
模块,那将。
信号
作为一个模块在Windows上可用,它仅限于可能信号的一小部分。文档指定了平台上的可用项,这就是为什么我使用modal
may
并添加了“即使windows对POSIX进程有非常基本的支持”;-)我观察到的一件事是,如果我以python脚本的形式运行它,那么它就可以正常工作了。如果我使用java/WLST运行它,那么它就不能很好地识别信号,正如我所说的,您处于一个非常特殊的情况下,既不是Unix也不是windows,但是您在Jython中运行它,Jython没有访问OS功能的权限,而缺少
信号
模块。那么你最好使用一个线程计时器,它应该在Jython中得到很好的实现。@zmo确实,这是我的观点<代码>信号应该在Windows上可用,因此它不会解释导入错误。但是,如果Jython不能传递信号,因此没有实现
信号
模块,那将是错误的。