検索

ホームページ  >  に質問  >  本文

python - tornado怎么处理非常耗时的定时任务?

代码大致如下:

class MainHandler(RequestHandler):
    def get(self):
        ...
        ...
        
        
def update():
    ...
    ...
    IOLoop.instance().add_timeout(time.time() + 3600, update)
    
   
if __name__ == '__main__':
    application = tornado.web.Application([
        ....
    ])
    server = HTTPServer(application)
    server.start(2) # 开启两个进程
    IOLoop.instance().add_timeout(time.time() + 3600, update)  # 耗时的定时update
    ...
    ...

其中update()是一个特别耗时的任务
目前的做法是加大add_timeout的时间间隔,以避免两个进程全都去做update了

因为对异步编程并不熟,所以想请教一下有没有更合适的做法

ringa_leeringa_lee2802日前862

全員に返信(4)返信します

  • PHP中文网

    PHP中文网2017-04-18 09:59:39

    このタスクはメインスレッドを長時間占有するようで、具体的な時間が不明であるため、コルーチンの使用は明らかに適切ではありません。 ThreadPoolExecutor を試してから、yield threadPool.submit(fn)

    を使用することをお勧めします。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-18 09:59:39

    tornado には独自の gen モジュールが付属しており、公式 Web サイトのドキュメントには明確な例が記載されています

    コルーチン化できます (コールバックを使用すると、ロジックが複雑になり、コードを読むのが面倒になります。スレッド/プロセスの場合は、スケジュールの問題を考慮する必要があります)

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:59:39

    それは無駄です。 。他に何も考慮しない場合、スレッドが 1 つで、1 か所に長時間滞在しすぎると、そのスレッドは実際にブロックされます。
    以下のコードを参照してください:

    リーリー

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:59:39

    タスクがネットワーク IO 集中型であるか、ローカル IO 集中型または CPU 集中型であるかによって異なります。前者の場合は、PeriodicCallback を使用して、キューを実装してからワーカーを作成することをお勧めします。タスク

    を単独で実行します。

    返事
    0
  • キャンセル返事