博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tornado之异步非阻塞
阅读量:4567 次
发布时间:2019-06-08

本文共 2426 字,大约阅读时间需要 8 分钟。

 同步模式:同步模式下,只有处理完前一个任务下一个才会执行

class MainHandler(tornado.web.RequestHandler):    def get(self):        time.sleep(10)        self.write("Hello, world")application = tornado.web.Application([    (r"/index", MainHandler),])
if __name__ == "__main__":     application.listen(8888)     tornado.ioloop.IOLoop.instance().start()

 

tornado如何使用异步非阻塞:

  -Future对象

  -IO事件循环

  -生成器

异步模式

装饰器 + Future 从而实现Tornado的异步非阻塞

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对象中放置数据或信号时,此连接是不断开的。

 

简单实现的异步非阻塞

# Author:songimport tornado.webimport tornado.ioloopfrom tornado import genfrom tornado.concurrent import Futureimport timeclass MainHandler(tornado.web.RequestHandler):    @gen.coroutine    def get(self):        future = Future()        tornado.ioloop.IOLoop.current().add_timeout(time.time() + 5, self.done)#模拟出现阻塞        yield future    def done(self, *args, **kwargs):        self.write('async')        self.finish()class LoginHandler(tornado.web.RequestHandler):    def get(self):        self.write('登录')    def post(self, *args, **kwargs):        print(self.get_argument('user'))        self.redirect('https://home.cnblogs.com/u/master-song/')application = tornado.web.Application([    (r"/main", MainHandler),    (r"/login", LoginHandler),])if __name__ == "__main__":    application.listen(8888)    tornado.ioloop.IOLoop.instance().start()
tornado_async

Tornado提供了httpclient类库用于发送Http请求,其配合Tornado的异步非阻塞使用

class MainHandler(tornado.web.RequestHandler):    @gen.coroutine    def get(self):        http = httpclient.AsyncHTTPClient()        yield http.fetch("http://www.google.com", self.done)    def done(self, response):            self.finish()
tornado_async

 

future=Future()

1.挂起当前请求,线程可以处理其他请求

2.future设置值,当前挂起请求返回

 

转载于:https://www.cnblogs.com/master-song/p/9438922.html

你可能感兴趣的文章
1python基础语法_11模块
查看>>
时间管理
查看>>
document.getElementsByTagName函数
查看>>
启停无线网卡bat脚本
查看>>
需求分析的故事——如何练就需求分析的火眼金晴?
查看>>
UIGestureRecognizer手势
查看>>
模拟http或https请求,实现ssl下的bugzilla登录、新增BUG,保持会话以及处理token
查看>>
Java的慢和稳
查看>>
日志框架SLF4J
查看>>
C# 内存管理优化畅想----前言
查看>>
标准 OpenStack 多region配置
查看>>
Maven生成源码包
查看>>
理解 js的 async/await
查看>>
D3.js中对array的使用
查看>>
Ext2文件系统
查看>>
ios--二维码生成
查看>>
JavaEE——Spring4--(2)Bean的配置
查看>>
Mac 安装thrift
查看>>
Ubuntu上ftp的vsftpd.conf文件的配置
查看>>
L.xml
查看>>