Торнадо PeriodicCallback выполнить сразу - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу обновлять объект каждые 10 минут, поэтому я использую tornado.ioloop.PeriodicCallback(myjob, 10*60*1000) НО первое выполнение происходит через 10 минут. Есть ли какие-либо настройки, чтобы myjob работал при 0 мин , 10 мин, 20 мин .....?

class Store(object):
    def __init__(self):
        self.data = None

    @tornado.gen.coroutine
    def load(self):
        with (yield STORE_POOL.connected_client()) as client:
            data = yield client.call("HGETALL", self.static_dict_key)
            self.data = {data[i].decode("utf-8"): int(data[i + 1]) for i in range(0, len(data), 2)}


def main():
    ...
    store = Store()
    # ----> Do i need to add some code here? [1]
    backjob = tornado.ioloop.PeriodicCallback(store.load, BACKJOB_TIME)
    backjob.start()

Нужно ли добавить код в [1]?
Я предполагаю, что будет 2 плана:
1> изменить некоторые настройки в PeriodicCallback().
2> выполнить store.load один раз перед PeriodicCallback (), НО я понятия не имею, как выполнить задание синхронно с @tornado.gen.coroutine только один раз.

1 Ответ

0 голосов
/ 27 апреля 2018

Это очень часто, и для удобства я написал подобные функции. Вот простой способ добавления переменной времени выполнения:

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)
...