Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python 2.4中在0.5秒后发出警报信号_Python_Timeout_Signals_Alarm_Python 2.4 - Fatal编程技术网

如何在python 2.4中在0.5秒后发出警报信号

如何在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所提到的

我想在in运行0.5秒后超时一段特定的python代码。因此,我打算在0.5秒后引发一个异常/信号,并优雅地处理它,然后继续代码的其余部分

在python中,我知道
signal.alarm()
可以设置整数秒的报警。是否有其他方法可以在0.5秒后生成警报<代码>信号.setitimer()在其他帖子中建议的在python2.4中不可用,为此我需要使用python2.4?

您有两个选项:

  • 在相关代码运行时轮询
    time.time()
    或类似程序。显然,只有在代码在您的控制下,这才是可行的

  • 正如pajton所提到的,您可以编写一个C扩展来调用系统调用
    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()