如何在python 2.4中在0.5秒后发出警报信号
我想在in运行0.5秒后超时一段特定的python代码。因此,我打算在0.5秒后引发一个异常/信号,并优雅地处理它,然后继续代码的其余部分 在python中,我知道如何在python 2.4中在0.5秒后发出警报信号,python,timeout,signals,alarm,python-2.4,Python,Timeout,Signals,Alarm,Python 2.4,我想在in运行0.5秒后超时一段特定的python代码。因此,我打算在0.5秒后引发一个异常/信号,并优雅地处理它,然后继续代码的其余部分 在python中,我知道signal.alarm()可以设置整数秒的报警。是否有其他方法可以在0.5秒后生成警报信号.setitimer()在其他帖子中建议的在python2.4中不可用,为此我需要使用python2.4?您有两个选项: 在相关代码运行时轮询time.time()或类似程序。显然,只有在代码在您的控制下,这才是可行的 正如pajton所提到的
signal.alarm()
可以设置整数秒的报警。是否有其他方法可以在0.5秒后生成警报<代码>信号.setitimer()在其他帖子中建议的在python2.4中不可用,为此我需要使用python2.4?您有两个选项:
time.time()
或类似程序。显然,只有在代码在您的控制下,这才是可行的setitimer()
。这并不难,因为您可以简单地从Python更高版本的源代码中复制signal.getitimer()
和signal.setitimer()
。它们只是围绕同名系统调用的薄薄包装
只有在使用CPython并且您所在的环境允许您使用自定义C扩展时,此选项才可行
编辑:以下是复制自(Python许可证适用)的代码:
现在,如果幸运的话,您应该能够使用
import itimer
并调用itimer.setitimer()
从耐心等待的“守护进程”线程发出警报。在下面的代码中,
snoozealarm
通过snoozealarm
线程执行您想要的操作:
#! /usr/bin/env python
import os
import signal
import threading
import time
class SnoozeAlarm(threading.Thread):
def __init__(self, zzz):
threading.Thread.__init__(self)
self.setDaemon(True)
self.zzz = zzz
def run(self):
time.sleep(self.zzz)
os.kill(os.getpid(), signal.SIGALRM)
def snoozealarm(i):
SnoozeAlarm(i).start()
def main():
snoozealarm(0.5)
while True:
time.sleep(0.05)
print time.time()
if __name__ == '__main__':
main()
写一个C扩展是一个选择…对于投票结束这个问题的人来说,支持这个想法是一个完全相同的选择:你真的读过OP问题直到它结束吗?这个问题在我看来是完全正确的。@mac:我认为投票结束的人已经意识到了她的错误——至少她删除了自动生成的评论。:)绝对未测试:但是如果信号发生在线程下,那么运行要修剪的代码,并在主代码中运行计时器(轮询
time.time()
)怎么样?计时器可能会在达到限制后终止线程。。。[很难看,但是…不能用吗?]@mac:不,这个不行。您不能在Python中终止线程。@sven:代码将不在我的控制之下。有很多计算和函数调用,很难在一个地方进行投票。我很少使用线程,所以我相信你!然而,我在那里是在实际工作中实现的(尽管有局限性),我正在使用CPython,并且允许使用C++扩展(我使用LIbBooST)进行某些计算。所以请提供更多的细节,这就是我所说的“逆向”工程+1 ;)
import itimer
#! /usr/bin/env python
import os
import signal
import threading
import time
class SnoozeAlarm(threading.Thread):
def __init__(self, zzz):
threading.Thread.__init__(self)
self.setDaemon(True)
self.zzz = zzz
def run(self):
time.sleep(self.zzz)
os.kill(os.getpid(), signal.SIGALRM)
def snoozealarm(i):
SnoozeAlarm(i).start()
def main():
snoozealarm(0.5)
while True:
time.sleep(0.05)
print time.time()
if __name__ == '__main__':
main()