2016-12-10 6 views
1

В настоящее время в моем приложении «Торнадо» я периодически звоню, используя PeriodicCallback каждый час. Как это:Как начать периодический обратный вызов Tornado в определенное время?

import tornado.ioloop 
from tornado.ioloop import PeriodicCallback 

if __name__ == "__main__": 
    tornado.options.parse_command_line() 
    app = tornado.web.Application(
     handlers=urls, 
     template_path=os.path.join(os.path.dirname(__file__), "templates"), 
     static_path=os.path.join(os.path.dirname(__file__), "static"), 
     debug=True 
    ) 
    http_server = tornado.httpserver.HTTPServer(app) 
    http_server.listen(options.port) 

    # Here i have option to specify interval, but how to specify when to start? 
    daily_alerts = PeriodicCallback(lambda: send_email.daily_alert(), 3600000) 
    daily_alerts.start() 
    tornado.ioloop.IOLoop.instance().start() 

Здесь, у меня есть возможность задать интервал времени (3600000), но как я могу определить, когда этот журнал обратного вызова должен начать?

ответ

3

Если вы хотите точно контролировать, когда обратный вызов запланирован, лучше использовать IOLoop.add_timeout вместо PeriodicCallback.

def schedule_next_email(): 
    tomorrow = datetime.date.today() + datetime.timedelta(days=1) 
    midnight = datetime.combine(tomorrow, datetime.time.min) 
    def wrapper(): 
     send_email.daily_alert() 
     schedule_next_email() 
    IOLoop.current().add_timeout(midnight, wrapper) 

schedule_next_email() # call at startup to schedule first call 

Повторное вычисление интервала каждый раз помогает посылать в то же время каждый день, даже когда сбережения дневного изменения времени и дни может быть либо 23 или 25 часов.

+0

Большое спасибо. Примите ваш ответ, как только я его проведу в какой-то момент. –

 Смежные вопросы

  • Нет связанных вопросов^_^