python - 如何在 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()
解决方案
在 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)
推荐阅读
- python - Equally distribute and zip two lists of different length in Python
- java - 如何在自己的模块中使用netbeans“朋友”模块?
- html - 顶栏 CSS 的问题
- amazon-web-services - CloudWatch 是否执行 SNMP 监控?
- xaml - Background Image XAML
- corda - 当每个节点使用不同 ISP 提供的单独 Internet 服务和连接时,节点是否可以相互通信?
- eclipse - Git Repository on private server
- excel - Excel VBA 文本文件导入为空白
- taskbar - Is it possible to 'Pin to taskbar' using Inno Setup?
- css - The background image in my react application is not showing