多个定期计时器

时间:2009-07-31 18:40:21

标签: python

是否有用于创建多个定期计时器的标准python模块。 我想设计一个系统,它支持在一个线程中创建不同周期的多个周期性定时器。系统应该能够在任何时间取消特定的计时器。

提前感谢任何输入!

2 个答案:

答案 0 :(得分:6)

查看Python标准库中的sched模块 - 本身并不直接支持定期计时器,只支持一次性“事件”,而是将一次性事件转换为标准技巧的标准技巧一个周期性计时器适用(可调用处理一次性事件只是重新安排自己进行下一次重复,然后继续做实际工作)。

定义一个“计划的定期计时器”类来封装关键想法可能很方便:

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);您可能还需要在那里设置优先级(可能默认值为0),而不是使用上面使用的常量0优先级。

答案 1 :(得分:2)

如果你必须坚持使用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)

或者你可能想看看stackless - 它非常适合你想做的事情,并且可以比上面的调度程序做更细粒度的任务切换。