Python 多周期定时器
是否有用于创建多个周期计时器的标准python模块。 我想设计一个系统,它支持在一个线程中创建多个不同周期的周期计时器。系统应能够在任何时间点取消特定计时器Python 多周期定时器,python,Python,是否有用于创建多个周期计时器的标准python模块。 我想设计一个系统,它支持在一个线程中创建多个不同周期的周期计时器。系统应能够在任何时间点取消特定计时器 提前感谢您的任何意见 如果您必须坚持使用一个线程,请维护一个任务列表,以及它们应该执行的频率和应该调用的函数: import time def example1(): print 'Example' class Task(object): def __init__(self, func, delay, args=()):
提前感谢您的任何意见 如果您必须坚持使用一个线程,请维护一个任务列表,以及它们应该执行的频率和应该调用的函数:
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——它非常适合你想要做的事情,并且可以比上面的调度器进行更细粒度的任务切换。查看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
方法(模板方法设计模式)。当然,您可以选择更灵活的体系结构,例如让\uuuu init\uuuu
接受一个可调用的和参数以及一个调度程序(一个self.scheduler
的实例)和一个周期(以秒为单位的浮点,如果您使用time.time和time.sleep以标准方式实例化调度程序);或者,您可能还希望在此处设置优先级(默认值为0),而不是使用我上面使用的恒定0优先级。看起来像NIH,可以使用Alex Martelli在回答中指出的sched模块。这种方法在微控制器中常见,在多进程计算中,当您不需要担心对其他进程的惩罚时(因为没有),这有点昂贵。