python - tornado怎么处理非常耗时的定时任务?
ringa_lee
ringa_lee 2017-04-18 09:57:39
0
4
864

代码大致如下:

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_lee
ringa_lee

ringa_lee

répondre à tous(4)
Ty80

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)

左手右手慢动作

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)

伊谢尔伦

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()
大家讲道理

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal