版权声明:本文为博主原创文章,未经博主允许不得转载。 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()