首页 > 解决方案 > 如何在 Tornado Web 服务中达到异步请求的目的

问题描述

问题:我为我的模型设置了一个基于 tonardo 的 Web 服务。并且随着请求并发的增加,web 很容易被拒绝。

我尝试过的:我已经尝试阅读一些相关代码,例如龙卷风中的异步框架,但我无法获得有效的想法。

Web服务代码如下:

class mainhandler(tornado.web.RequestHandler):
    def get(self):
        self.write('hello')

    def post(self):
        in_data = json.loads(self.request.body.decode('utf-8'))
        res = predict(in_data)
    def set_default_headers(self):
        self.set_header('content_type', 'application/json;charset=utf-8')

application = tornado.web.Application([(r'/', mainhandler)])

if __name__ == "__main__":
    application.listen(port=5000)
    tornado.ioloop.IOloop.current().start()

标签: pythonwebtornado

解决方案


在 Tornado 中,任何缓慢的东西都必须在协程中调用await。如果predict它自己做一些 I/O,它应该被做成一个协程,这样它就可以异步地做那个 I/O。如果是纯计算,你应该在线程池上运行它:

async def post(self):
    in_data = json.loads(self.request.body.decode('utf-8'))
    res = await IOLoop.current().run_in_executor(None, predict, in_data)

推荐阅读