介绍完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过了这么多年还算开发活跃(一个大神扛起了一片天啊),不同于多线程模型的一潭死水,看它的代码你会发现它还是紧跟潮流的,而且有一点。它的内部虽然一直在变动,但是提供给用户的使用接口是很稳定的,后续就会发现这个坑有多大
阅读全文在多线程多进程当道的年代这个被称为高级并发的模块还是很令人惊艳的。concurrent.future模块的厉害之处在于封装了多线程、多进程、锁、队列到一起。这些细节使用者都不需要知道。四五行代码能实现以往二三十行实现的效果。而且多线程和多进程的使用方式完全一样,堪称完美杰作。可惜,现在已经是异步时代了,主要是因为tornado用到了它的Future模块。我就看看它大概是怎样实现的
阅读全文多线程是个坑爹的课题,有多线程就有锁。Python中有低级线程模块_thread、再封装一下就是threading、再来一下就是from concurrent.futures import ThreadPoolExecutor
。其中涉及到的锁大概有Lock、RLock、Condition、Semaphore、BoundedSeamphore、Event。这么多看起来怪吓人的,其实这么多的锁全部只是由Lock演化出来的