tornado一起来-同步异步请求
一个web项目是不是别人会请求呢?做好了是不是会有很多人请求呢~
既然有请求,我们就说说请求的事。。。
主要内容参考[《Introduction to Tornado》中文翻译](http://demo.pythoner.com/itt2zh)
先来一个同步请求的,不知道什么叫同步请求的同学请自行百度。。。
走起!
main.py
```
# 同步请求
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
import urllib
import json
import datetime
import time
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
query = self.get_argument('q','1')
client = tornado.httpclient.HTTPClient()
response = client.fetch("http://127.0.0.1/api/index/getarticlelist.html?" + urllib.parse.urlencode({"page": query}))
self.write(""<span class="hljs-string">"
<div style="</span>text-align: center<span class="hljs-string">">
<div style="</span>font-size: 72px<span class="hljs-string">">%s</div>
<div style="</span>font-size: 144px<span class="hljs-string">">%.02f</div>
<div style="</span>font-size: 24px<span class="hljs-string">">tweets per second</div>
</div>"</span>"" % (query, response.request_time))
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
```

请求成功,响应时间0.09秒。看着还不错嘛。。。先等等这才一个请求,如果是多个请求呢?如果是多个同时请求呢?
看看效果

看到这,笑不出来。。。最长时间7秒多(心碎)。这才10并发而已。。。
很明显,响应时间随并发数增加成正比的增加。。。
下面来个异步的请求:
main\_sync.py
```
# 异步请求
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
import urllib
import json
import datetime
import time
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
query = self.get_argument('q',1)
client = tornado.httpclient.AsyncHTTPClient()
client.fetch("http://old.xiha650.com/api/index/getarticlelist.html?" + urllib.parse.urlencode({"page": query}), callback=self.on_response)
def on_response(self, response):
self.write(""<span class="hljs-string">"
<div style="</span>text-align: center<span class="hljs-string">">
<div style="</span>font-size: 72px<span class="hljs-string">">%s</div>
<div style="</span>font-size: 144px<span class="hljs-string">">%.02f</div>
<div style="</span>font-size: 24px<span class="hljs-string">">tweets per second</div>
</div>"</span>"" % (self.get_argument('q',1), response.request_time))
self.finish()
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
```
一样的效果 看看这个的并发效果。

隐隐约约,看到最长时间是3.75,比上个好多了。并且是偶尔才有个3秒的(看样子代码有问题呀)。。
异步请求效果还是很显著的。
下面上个优化的
```
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
import tornado.gen
import urllib
import json
import datetime
import time
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
query = self.get_argument('q',1)
client = tornado.httpclient.AsyncHTTPClient()
response = yield client.fetch("http://old.xiha650.com/api/index/getarticlelist.html?" + urllib.parse.urlencode({"page": query}))
self.write(""<span class="hljs-string">"
<div style="</span>text-align: center<span class="hljs-string">">
<div style="</span>font-size: 72px<span class="hljs-string">">%s</div>
<div style="</span>font-size: 144px<span class="hljs-string">">%.02f</div>
<div style="</span>font-size: 24px<span class="hljs-string">">tweets per second</div>
</div>"</span>"" % (query, response.request_time))
self.finish()
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
```
至于为什么优化,看看教程就知道了。
参考其他文章:
[http://www.jianshu.com/p/31fae7dd05ba](http://www.jianshu.com/p/31fae7dd05ba)
[https://www.cnblogs.com/apexchu/p/4226784.html](https://www.cnblogs.com/apexchu/p/4226784.html)
评论区