如何在Python中的特定时间运行某个函数?

时间:2011-03-01 17:04:48

标签: python real-time

例如我有函数do_something(),我希望它运行正好1秒(而不是.923秒。它不会。但是0.999是可以接受的。)

然而,do_something必须完全运行1秒非常非常重要。我在考虑使用UNIX时间戳并计算秒数。但我真的很想知道Python是否有办法以更美观的方式做到这一点......

函数do_something()是长时间运行的,必须在一秒钟后中断。

3 个答案:

答案 0 :(得分:2)

我从评论中得知,这里有一个while循环。这是一个基于Thread模块中_Timer源代码的threading子类。我知道你说你决定反对线程,但这只是一个定时器控制线程; do_something在主线程中执行。所以这应该是干净的。 (如果我错了,有人会纠正我!):

from threading import Thread, Event

class BoolTimer(Thread):
    """A boolean value that toggles after a specified number of seconds:

    bt = BoolTimer(30.0, False)
    bt.start()
    bt.cancel() # prevent the booltimer from toggling if it is still waiting
    """

    def __init__(self, interval, initial_state=True):
        Thread.__init__(self)
        self.interval = interval
        self.state = initial_state
        self.finished = Event()

    def __nonzero__(self):
        return bool(self.state)

    def cancel(self):
        """Stop BoolTimer if it hasn't toggled yet"""
        self.finished.set()

    def run(self):
        self.finished.wait(self.interval)
        if not self.finished.is_set():
            self.state = not self.state
        self.finished.set()

你可以像这样使用它。

import time

def do_something():
    running = BoolTimer(1.0)
    running.start()
    while running:
        print "running"              # Do something more useful here.
        time.sleep(0.05)             # Do it more or less often.
        if not running:              # If you want to interrupt the loop, 
            print "broke!"           # add breakpoints.
            break                    # You could even put this in a
        time.sleep(0.05)             # try, finally block.

do_something()

答案 1 :(得分:1)

Python的'sched'模块看起来合适:

http://docs.python.org/library/sched.html

除此之外:Python不是实时语言,也不是通常在实时操作系统上运行。所以你的要求有点可疑。

答案 2 :(得分:1)

这段代码可能适合你。说明听起来像你想要的:

http://programming-guides.com/python/timeout-a-function

它依赖于python signal模块:

http://docs.python.org/library/signal.html