Tornado系列基本介绍的差不多了,本篇介绍一些零散的东西。有了前面的知识,本篇会讲的比较粗略
阅读全文介绍完StackContext、gen.engine、gen.coroutine之后Tornado3.0以前的核心内容基本已经完结了。本篇介绍一下gen.coroutine中Future的应用,在tornado中生成一个队列的数据结构。如果经常写web的情况,单单只处理用户的输入给出输出,那么要求不会太多,也不会用到队列。可是如果你去写一个爬虫,肯定需要限速啥的,此时队列就是一个很有用的东西,很容易实现生产者消费者模型。Tornado官方的demo中也有一个[爬虫代码(https://github.com/tornadoweb/tornado/blob/master/demos/webspider/webspider.py)]演示如何使用队列(本篇基于v5.0.0)
阅读全文2013年Tornado3.0版本。gen.coroutine上线,直到今天它依旧是目前Tornado中使用最为广泛的装饰器。同时它也是接替gen.engine的存在。它基本去掉了gen.Task的套路。相对gen.engine而言。它只需要gen.coroutine就够了,写法上更为美观
阅读全文Tornado在2011年的2.1版本加入了gen.engine模块,该模块主要为了解决异步程序编写不够优雅的问题。力图让使用者离callback更远,这也是Tornado厉害的地方。本来内部各种事件处理,callback满天飞,可是在用户眼里,它那个class Handler(web.RequestHandler)下面get的写法和同步写法差不多嘛。和同步的写法一样,获得了更高的性能,我想这也是为什么Tornado能出彩的地方吧(本文代码基于v2.3.0)
阅读全文yield这个关键字在2001年2.2版本的时候就出现了。2006加入yield.send功能。然而直到2006年2.5版本才看到使用在contextmanager上,tornado 2011年才用它实现了神奇的gen逻辑。令我没想到的是
- yield出现的这么早
- yield厉害一点的应用(contentmanager)居然过了五年才加入到标准库。
- tornado的1.0.0版根本和yield没有一毛钱关系
- tornado最先引入yield居然并不是实现了gen
yield最先在tornado里面展露头角是在这个commit里面。大神就是大神,虽然这个代码仅仅只有几十行。可是我觉得思路很新奇,膜拜😀(代码基于v1.0.0和v1.1.0)
阅读全文WSGI毕竟是Python社区官方认可的规范,可是这种规范在多线程多进程模式下实现很简单,不太适合单线程异步这种情况。鉴于此Tornado并没有按照这个框架去实现一个WSGI的web框架,可是它却提供了基本的兼容,1.允许Tornado的application对象转变成WSGI application。2. 允许WSGI application在tornado ioloop中执行,只是这一切都不是完美的,它仅仅提供了基本的兼容,效率和可用性得不到保证。因此个人还是感觉很鸡肋的
阅读全文上一篇文章讲解了httpserver。它最终传入的是一个函数,接受的是Request对象,这和Tornado所展示的Hello World有一些差距。tornado的web模块就是将它从一个函数变化成一个类对象,并且包含了基础的路由功能,最终实现类似与这样的Hello World(代码基于1.0.0版本)
1 | from tornado import web |
Tornado可以当做一个http客户端去发送请求,可以处理需要和客户端建立长连接的请求。可是Tornado最为知名的还是它作为一个HTTP web框架…,上一篇讲述了IOLoop的套路。本篇讲解一下如何将IOLoop和httpserver联系起来(本代码思路依据1.0.0版本)
阅读全文这是Tornado系列的开篇,Tornado作为异步web框架2010年发布1.0版本。可以说Python社区搞了这么多年,为了获得比多线程多进程更高的性能,经历了Twisted、Tornado、yield、gevent、yield from、asyncio。也不知道什么时候才是一个尽头~~。Tornado过了这么多年还算开发活跃(一个大神扛起了一片天啊),不同于多线程模型的一潭死水,看它的代码你会发现它还是紧跟潮流的,而且有一点。它的内部虽然一直在变动,但是提供给用户的使用接口是很稳定的,后续就会发现这个坑有多大
阅读全文