Tornado---异步非阻塞

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013210620/article/details/80409873

asynchronous

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):
        client = tornado.httpclient.AsyncHTTPClient()

        client.fetch("http://www.baidu.com", callback=self.on_response)

    def on_response(self, response):
        print("response--->>>",response)
        self.finish()

if __name__ == "__main__":
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

基本使用

import tornado.ioloop
import tornado.web
from tornado import gen
from tornado.concurrent import Future
from tornado import httpclient

class AsyncHandler(tornado.web.RequestHandler):

    @gen.coroutine
    def get(self):
        future = Future()
        future.add_done_callback(self.doing)
        yield future
        # 或
        # tornado.ioloop.IOLoop.current().add_future(future,self.doing)
        # yield future

    def doing(self, *args, **kwargs):
        self.write('async')
        self.finish()


application = tornado.web.Application([
    (r"/index", AsyncHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

当发送GET请求时,由于方法被@gen.coroutine装饰且yield 一个 Future对象,那么Tornado会等待,等待用户向future对象中放置数据或者发送信号,如果获取到数据或信号之后,就开始执行doing方法。

异步非阻塞体现在当在Tornaod等待用户向future对象中放置数据时,还可以处理其他请求。

注意:在等待用户向future对象中放置数据或信号时,此连接是不断开的。

Tornado异步非阻塞本质:
视图函数yield一个futrue对象,futrue对象默认:
self._done = False ,请求未完成
self._result = None ,请求完成后返回值,用于传递给回调函数使用。

        tornado就会一直去检测futrue对象的_done是否已经变成True。

        如果IO请求执行完毕,自动会调用future的set_result方法:
                    self._result = result
                    self._done = True

示例AsyncHTTPClient

import tornado.ioloop
import tornado.web
import time
from tornado import gen
from tornado.concurrent import Future
from tornado import httpclient


class IndexHandler(tornado.web.RequestHandler):

    @gen.coroutine
    def get(self):
        print('请求进来了')
        # future = Future()
        # tornado.ioloop.IOLoop.current().add_timeout(time.time() + 10, self.done)
        # yield future

        http = httpclient.AsyncHTTPClient()
        yield http.fetch("http://www.baidu.com",callback=self.done)

    def done(self,*args,**kwargs):
        print(args,kwargs)
        self.write('OK')
        self.finish()

application = tornado.web.Application([
    (r"/index", IndexHandler),
])


if __name__ == "__main__":
    application.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

猜你喜欢

转载自blog.csdn.net/u013210620/article/details/80409873