tornado 异步 asynchronous 学习记录

Tornado 的特点就是异步非阻塞。

non-blocking I/O, 我简单的理解是“允许某一个操作可以继续进行,而不必等待某一资源的响应,预提供一个回调函数,用于处理、响应该资源的结果(当该资源返回相关内容的时候)”

对比异步I/O,我们最常见的就是同步I/O(线性编程),一次请求访问另一个资源,必须等待该资源的成功返回,方可进行下一步操作,如果该资源无响应(或异常),程序就终止(受限)于此。

sync/async的大致对比:

图片:sync-async.jpg

一个普通的web app,将会被用于异步请求的调用。

python code: 普通的web app

import logging  
  
import tornado.httpserver  
import tornado.ioloop  
import tornado.web  
  
  
class MainHandler(tornado.web.RequestHandler):  
  
    def get(self):  
        '''  
        The below is only a testing which will be exected to kill time,  
        and then we can find the asynchronous effect from the front page.  
        '''  
        for i in range(1, 100000):  
            print "kill time"  
        self.write("hello")  
  
  
settings = {  
    #"debug": True,  
}  
  
application = tornado.web.Application([  
    (r"/async-sync-test/", MainHandler),  
], **settings)  
  
if __name__ == "__main__":  
  
    http_server = tornado.httpserver.HTTPServer(application)  
    http_server.listen(8084)  
    tornado.ioloop.IOLoop.instance().start()

一次异步请求调用

python code: 异步请求调用

import logging  
  
import tornado.httpserver  
import tornado.ioloop  
import tornado.web  
  
from tornado.httpclient import AsyncHTTPClient  
  
class MainHandler(tornado.web.RequestHandler):  
  
  
    @tornado.web.asynchronous  
    def get(self):  
        http = tornado.httpclient.AsyncHTTPClient()  
        http.fetch("http://localhost:8084/async-sync-test/", callback=self._test_callback)  
        self.write("Hello to the Tornado world! ")  
        '''  
        Flushes the current output buffer to the network.  
        '''  
        self.flush()  
  
    '''  
    _test_callback is a callback function used for the processing of the response from the async request  
    '''  
    def _test_callback(self, response):  
        self.write(response.body)  
        '''  
        refer the offical document, we are responsible for the invocation of the finish function in the async case.  
        '''  
        self.finish()  
  
settings = {  
    #"debug": True,  
}  
  
application = tornado.web.Application([  
    (r"/", MainHandler),  
], **settings)  
  
if __name__ == "__main__":  
  
    http_server = tornado.httpserver.HTTPServer(application)  
    http_server.listen(8083)  
    tornado.ioloop.IOLoop.instance().start()
Relative Articles