Maison  >  Questions et réponses  >  le corps du texte

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_lee2741 Il y a quelques jours831

répondre à tous(4)je répondrai

  • PHP中文网

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

    Il semble que cette tâche occupera le fil principal pendant longtemps et que l'heure précise n'est pas sûre, donc l'utilisation de coroutines n'est évidemment pas appropriée. Il est recommandé d'essayer ThreadPoolExecutor, puis d'utiliser rendement threadPool.submit(fn)

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 09:59:39

    tornado est livré avec son propre module gen, et la documentation de son site officiel contient des exemples clairs

    Vous pouvez le coroutiner. (Avec les rappels, la logique est compliquée et il est fatigant de lire le code ; pour les threads/processus, les problèmes de planification doivent être pris en compte)

    répondre
    0
  • 伊谢尔伦

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

    C’est inutile. . Si vous ne considérez rien d'autre, si vous n'avez qu'un seul fil de discussion et que vous passez trop de temps au même endroit, il est vraiment bloqué.
    Référez-vous au code ci-dessous :

    class TestHandler(tornado.web.RequestHandler):
        @tornado.web.asynchronous
        @tornado.gen.coroutine
        def get(self):
            yield gen.Task(self.sleep)
            self.write('ok')
            self.finish()
    
        def sleep(self, callback):
            for i in range(100000000):
                if i % 100000 == 0:
                    pass
            print('ooo')
            callback()
    

    répondre
    0
  • 大家讲道理

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

    Cela dépend si votre tâche est gourmande en IO réseau ou gourmande en IO locale/CPU. Si c'est la première, utilisez simplement PeriodicCallback. Si c'est la seconde, il est recommandé d'implémenter une file d'attente, puis d'écrire un travailleur sur. exécutez-le seul. Tâche

    répondre
    0
  • Annulerrépondre