Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14553
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-16 20:05
文章分类
文章存档

2014年(4)

我的朋友

分类: Python/Ruby

2014-10-19 20:44:40

源码如下:(Tornado 4.0.2)

点击(此处)折叠或打开

  1. class PeriodicCallback(object):
  2.     """Schedules the given callback to be called periodically.

  3.     The callback is called every ``callback_time`` milliseconds.

  4.     `start` must be called after the `PeriodicCallback` is created.
  5.     """
  6.     def __init__(self, callback, callback_time, io_loop=None):
  7.         self.callback = callback
  8.         if callback_time <= 0:
  9.             raise ValueError("Periodic callback must have a positive callback_time")
  10.         self.callback_time = callback_time
  11.         self.io_loop = io_loop or IOLoop.current()
  12.         self._running = False
  13.         self._timeout = None

  14.     def start(self):
  15.         """Starts the timer."""
  16.         self._running = True
  17.         self._next_timeout = self.io_loop.time()
  18.         self._schedule_next()

  19.     def stop(self):
  20.         """Stops the timer."""
  21.         self._running = False
  22.         if self._timeout is not None:
  23.             self.io_loop.remove_timeout(self._timeout)
  24.             self._timeout = None

  25.     def _run(self):
  26.         if not self._running:
  27.             return
  28.         try:
  29.             return self.callback()
  30.         except Exception:
  31.             self.io_loop.handle_callback_exception(self.callback)
  32.         finally:
  33.             self._schedule_next()

  34.     def _schedule_next(self):
  35.         if self._running:
  36.             current_time = self.io_loop.time()
  37.             while self._next_timeout <= current_time:
  38.                 self._next_timeout += self.callback_time / 1000.0
  39.             self._timeout = self.io_loop.add_timeout(self._next_timeout, self._run)

    PeriodicCallback类用来周期的调用一个callback函数。一般如下方式使用:

点击(此处)折叠或打开

  1. obj = PeriodicCallback(callback=callback, callback_time=callback_time, io_loop=io_loop)
  2. obj.start()
  3. ......
  4. obj.stop()
在__init__()函数中,检验callback_time值的合法性,并将PeriodicCallback实例的状态设置为False,当前的_timeout为None,_timeout用来标识ioloop中的一个定时运行项目,可以向ioloop中添加或从其中移除。调用start()函数时,将实例的状态设置为True,表示这个周期回调的实例正在运行,并且获得ioloop的当前时间,之后每隔一个或多个callback_time时间调用一次callback。在start()函数中调用了_schedule_next()函数,在_schedule_next()函数中,将_run()函数添加到ioloop中,当_run()函数调用时,执行callback回调函数,然后重新调用__schedule_next()函数,直到该实例的stop()函数被调用。在_schedule_next()函数中,获得下一个callback的调用时刻,然后将调用时刻和_run()函数传给ioloop生成一个_timeout用来标识这个周期调用。


阅读(6300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~