Это очень часто, и для удобства я написал подобные функции. Вот простой способ добавления переменной времени выполнения:
from tornado import ioloop
class VariableFire(object):
def __init__(self, max_delay, increment_by):
"""
:param max_delay: Max number of seconds.
:param increment_by: Increment delay per interval until max is hit.
"""
self.max_delay = max_delay
self.increment_by = increment_by
self.delay = 1
def fire(self, fn, *args, **kwargs):
# execute
fn(*args, **kwargs)
# get the delay interval
delay = self.delay
if self.delay < self.max_delay:
# increment the delay by certain amount
self.delay += self.increment_by
elif delay > self.max_delay:
# reset value to max_delay
self.delay = delay = self.max_delay
ioloop.IOLoop.current().call_later(delay, self.fire, fn, *args, **kwargs)
variable = VariableFire(max_delay = 30, increment_by = 3)
variable.fire(print, 'Hello World')
ioloop.IOLoop.current().start()
Если вы умны, вы можете превратить его в декоратор и использовать его непосредственно для функций, но ради простоты ...
1> изменить некоторые настройки в PeriodicCallback ().
Невозможно сделать это с помощью PeriodicCallback, но в моем примере вы можете изменить интервалы позже.
2> выполнить store.load один раз перед PeriodicCallback (), НО у меня нет
идея о том, как выполнять работу синхронно с @ tornado.gen.coroutine
только один раз.
Если вы решите использовать код, похожий на мой пример, вы можете просто запустить:
variable.fire(store.load)