Несколько периодических таймеров - PullRequest
3 голосов
/ 31 июля 2009

Существует ли какой-либо стандартный модуль python для создания нескольких периодических таймеров. Я хочу разработать систему, которая поддерживает создание нескольких периодических таймеров разной периодичности, работающих в одном потоке. Система должна иметь возможность отменить определенный таймер в любой момент времени.

Заранее спасибо за любой вклад!

Ответы [ 2 ]

6 голосов
/ 01 августа 2009

Обратите внимание на модуль sched в стандартной библиотеке Python - по сути, он не поддерживает напрямую периодические таймеры, только одноразовые «события», но является стандартным приемом для включения одноразовых применяется событие в периодическом таймере (вызываемое событие, обрабатывающее одноразовое событие, просто перепланирует себя для следующего повторения, прежде чем перейти к выполнению реальной работы).

Может быть полезно определить класс «запланированного периодического таймера» для инкапсуляции ключевых идей:

class spt(object):

  def __init__(self, scheduler, period):
    self._sched = scheduler
    self._period = period
    self._event = None

  def start(self):
    self._event = self._sched.enter(0, 0, self._action, ())

  def _action(self):
    self._event - self._sched.enter(self._period, 0, self._action, ())
    self.act()

  def act(self):
    print "hi there"

  def cancel(self):
    self._sched.cancel(self._event)

Чтобы связать значимое действие с запланированным периодическим таймером, создайте подкласс spt и переопределите метод act (шаблон разработки метода шаблона). Конечно, вы можете выбрать более гибкие архитектуры, например, если __init__ принимать вызываемые и аргументы, а также планировщик (экземпляр self.scheduler) и точку (как число с плавающей запятой в секундах, если вы создаете планировщик в стандартный способ с time.time и time.sleep); При желании вы также можете установить приоритет (возможно, со значением default , равным 0), а не использовать постоянный приоритет 0, который я использовал выше.

2 голосов
/ 31 июля 2009

Если вам нужно придерживаться 1 потока - ведите список задач, а также частоту, с которой они должны выполняться, и какую функцию следует вызывать:

import time

def example1():
    print 'Example'

class Task(object):
    def __init__(self, func, delay, args=()):
        self.args = args
        self.function = func
        self.delay = delay
        self.next_run = time.time() + self.delay

    def shouldRun(self):
        return time.time() >= self.next_run

    def run(self):
        self.function(*(self.args))
        self.next_run += self.delay
        # self.next_run = time.time() + self.delay

tasks = [Task(example1, 1)] # Run example1 every second
while True:
    for t in tasks:
        if t.shouldRun():
            t.run()
        time.sleep(0.01)

Или, возможно, вы захотите взглянуть на стек без стеков - который идеально подходит для того, что вы хотите сделать, и позволяет выполнять более тонкое переключение задач, чем вышеуказанный планировщик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...