2016-12-10 5 views
1

現在、私のTornadoアプリケーションでは、毎時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

コールバックのスケジュールを正確に制御する場合は、PeriodicCallbackの代わりにIOLoop.add_timeoutを直接使用する方がよいでしょう。夏時間の変更と日がいずれかの23または25時間を持つことができたときにあなたが毎日でも同時に送信するたびに助け間隔を再計算

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 

+0

ありがとうございます。私はいつか試してみるとあなたの答えを受け入れるでしょう。 –

関連する問題