使用协程后我遇到了性能问题,代码很简单,如官方文档:
class MainHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
httpClient = tornado.httpclient.AsyncHTTPClient()
yield httpClient.fetch('http://google.com/', method = 'GET')
测试命令是:
wrk -t12 -c400 -d30s http://10.0.0.10:2002/
我每秒只能获得66个请求,如果我删除httpClient.fetch()
,我每秒可以获得1659个请求。
Tornado在E5-2666 v3 @ 2.90GHz上运行单个进程,此进程的CPU使用率均为100%。
我正在使用Tornado v4.4.1,python 2.7。
答案 0 :(得分:4)
默认情况下,AsyncHTTPClient不会等待超过10个并发请求。因此,如果每次获取在开始和结束之间花费大约150ms,那么这将限制您每秒约66次提取。由于每个MainHandler.get
等待AsyncHTTPClient.fetch
,这意味着get
也会出现瓶颈。
在程序的最开始,像这样提升最大客户端:
tornado.httpclient.AsyncHTTPClient.configure(None, max_clients=1000)
在所有导入之后以及创建任何AsyncHTTPClients之前执行此操作。