tornado 异步 asynchronous 学习记录

Tornado 的特点就是异步非阻塞。下面记录一下tornado 异步 asynchronous 的学习理解。

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

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

sync/async的大致对比

图片:sync-async.jpg

tornado 异步 asynchronous  学习记录

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

python code: 普通的web app

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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: 异步请求调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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()

本文网址: https://pylist.com/topic/37.html 转摘请注明来源

Suggested Topics

服务器推送技术 Tornado comet

long poll的原理是,客户端与服务器将建立一条长连接,也就是说,客户端会发出一个请求,而服务器,将阻塞请求,直到有数据需要传递,才会返回。 ...

Leave a Comment