代码大致如下:
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了
因为对异步编程并不熟,所以想请教一下有没有更合适的做法
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 :
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