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了
因为对异步编程并不熟,所以想请教一下有没有更合适的做法
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
听起来这个任务会占用主线程很久而且不确定具体耗时,那么用协程显然不合适。建议试试ThreadPoolExecutor,然后用yield threadPool.submit(fn)
tornado自带了gen模块, 其官网文档有较为清晰的例子
可以将其协程化. (用回调, 逻辑一复杂, 看代码很心累; 线程/进程, 要考虑调度问题)
没用的。。如果不考虑别的,单线程,你要在一个地方耗时太久,那就是真的阻塞了。
参考下面代码:
取决于你的任务是网络io密集型,还是本地io密集型/cpu密集型,如果是前者,只要使用PeriodicCallback就行了,如果是后者,建议实现一个queue,然后写一个worker单独跑任务