Как я могу запустить определенную функцию для определенного времени в Python? - PullRequest
2 голосов
/ 01 марта 2011

Например, у меня есть функция do_something (), и я хочу, чтобы она работала ровно 1 секунду (а не 0,923 секунды. Это не сработает. Однако 0,999 приемлемо.)

Однако это оченьочень важно, что do_something должен работать ровно 1 секунду.Я думал об использовании метки времени UNIX и подсчета секунд.Но мне действительно интересно, есть ли у Python способ сделать это более эстетичным способом ...

Функция do_something() работает долго и должна быть прервана ровно через одну секунду.

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

Я понял из комментариев, что где-то здесь есть цикл 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 голос
/ 01 марта 2011

Этот бит кода может работать для вас.Описание звучит так, как вы хотите:

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

Используется модуль python signal:

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

1 голос
/ 01 марта 2011

Модуль 'sched' в Python выглядит подходящим:

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

Кроме того: Python не является языком реального времени и обычно не работает в ОС реального времени. Так что ваше требование довольно сомнительно.

...