tornado一起来-同步异步请求

2017-12-15 18:37:37 查看 1018 回复 0

一个web项目是不是别人会请求呢?做好了是不是会有很多人请求呢~

既然有请求,我们就说说请求的事。。。

主要内容参考《Introduction to Tornado》中文翻译

先来一个同步请求的,不知道什么叫同步请求的同学请自行百度。。。

走起!
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("""
<div style="text-align: center">
    <div style="font-size: 72px">%s</div>
    <div style="font-size: 144px">%.02f</div>
    <div style="font-size: 24px">tweets per second</div>
</div>""" % (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()

000

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

2222

看到这,笑不出来。。。最长时间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("""
<div style="text-align: center">
    <div style="font-size: 72px">%s</div>
    <div style="font-size: 144px">%.02f</div>
    <div style="font-size: 24px">tweets per second</div>
</div>""" % (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()

一样的效果 看看这个的并发效果。

1111

隐隐约约,看到最长时间是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("""
<div style="text-align: center">
    <div style="font-size: 72px">%s</div>
    <div style="font-size: 144px">%.02f</div>
    <div style="font-size: 24px">tweets per second</div>
</div>""" % (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

https://www.cnblogs.com/apexchu/p/4226784.html