第一部分:Twisted 理论基础......................................................................................................... 4
前言:..........................................................................................................................................4
模型:.......................................................................................................................................4
动机:..........................................................................................................................................7
第二部分:异步编程初探与 reactor 模式...................................................................................... 8
关于对你的假设....................................................................................................................... 9
获取代码的方法....................................................................................................................... 9
低效的诗歌服务器................................................................................................................... 9
阻塞模式的客户端................................................................................................................. 10
异步模式的客户端................................................................................................................. 11
更近一步的观察..................................................................................................................... 12
第三部分:初步认识 Twisted....................................................................................................... 14
用 twisted 的方式实现前面的内容........................................................................................14
你好,Twisted........................................................................................................................ 15
有关回调的一些其它说明:................................................................................................. 16
退出 Twisted........................................................................................................................... 17
捕获它,Twisted.................................................................................................................... 19
请继续讲解诗歌服务器......................................................................................................... 19
第四部分:由 Twisted 支持的诗歌客户端.................................................................................. 20
第一个 twisted 支持的诗歌服务器........................................................................................20
Twisted 接口........................................................................................................................... 21
更多关于回调的知识............................................................................................................. 23
结束语.....................................................................................................................................24
抽象地构建客户端................................................................................................................. 25
核心的循环体......................................................................................................................... 26
Transports................................................................................................................................26
Protocols..................................................................................................................................27
Protocol Factories....................................................................................................................27
诗歌下载客户端 2.0:第一滴心血....................................................................................... 27
结束语:.................................................................................................................................32
第五部分:由 Twisted 支持的诗歌客户端.................................................................................. 33
抽象地构建客户端................................................................................................................. 33
核心的循环体......................................................................................................................... 34
Transports................................................................................................................................34
Protocols..................................................................................................................................35
Protocol Factories....................................................................................................................35
诗歌下载客户端 2.0:第一滴心血....................................................................................... 35
结束语:.................................................................................................................................40
第六部分:抽象地利用 Twisted................................................................................................... 41
打造可以复用的诗歌下载客户端......................................................................................... 41
客户端 3.0............................................................................................................................... 42
讨论.........................................................................................................................................43
异常问题的处理..................................................................................................................... 44
版本 3.1...................................................................................................................................46
总结:.....................................................................................................................................47
第七部分:小插曲,Deferred.......................................................................................................47
回调函数的后序发展............................................................................................................. 47
Deferred...................................................................................................................................49
总结:.....................................................................................................................................54
第八部分:使用 Deferred 的诗歌下载客户端............................................................................. 54
客户端 4.0............................................................................................................................... 55
讨论.........................................................................................................................................57
第九部分:第二个小插曲,Deferred........................................................................................... 60
更多关于回调的知识............................................................................................................. 60
Deferred 的优秀架构..............................................................................................................63
Callbacks 与 Errbacks,成对出现......................................................................................... 66
deferred 模拟器.......................................................................................................................66
第十部分:增强 defer 功能的客户端........................................................................................... 67
版本 5.0...................................................................................................................................67
版本 5.1...................................................................................................................................71
总结:.....................................................................................................................................73
第十一部分:改进诗歌下载服务器............................................................................................. 74
诗歌下载服务器..................................................................................................................... 74
讨论.........................................................................................................................................75
第十二部分:改进诗歌下载服务器............................................................................................. 77
新的服务器实现..................................................................................................................... 77
设计协议.................................................................................................................................77
代码.........................................................................................................................................77
一个简单的客户端................................................................................................................. 79
讨论.........................................................................................................................................79
第十三部分:使用 Deferred 新功能实现新客户端..................................................................... 80
介绍.........................................................................................................................................80
客户端版本 6.0....................................................................................................................... 82
结束语.....................................................................................................................................84
第十四部分:Deferred 用于同步环境.......................................................................................... 84
介绍.........................................................................................................................................84
代理 1.0 版本......................................................................................................................... 86
代理 2.0 版本......................................................................................................................... 87
总结.........................................................................................................................................88
第十五部分:测试诗歌................................................................................................................. 88
简介.........................................................................................................................................88
例子.........................................................................................................................................89
讨论.........................................................................................................................................90
总结.........................................................................................................................................91
参考练习.................................................................................................................................92
第十六部分:Twisted 进程守护.................................................................................................. 92
简介.........................................................................................................................................92
IService....................................................................................................................................92
IServiceCollection................................................................................................................... 93
Application.............................................................................................................................. 94
Twisted Logging......................................................................................................................94
FastPoetry 2.0..........................................................................................................................94
Twisted tac files.......................................................................................................................95
Running the Server..................................................................................................................97
A Real Daemon....................................................................................................................... 98
Twisted 插件系统.................................................................................................................. 99
IPlugin..................................................................................................................................... 99
IServiceMaker....................................................................................................................... 100
Fast Poetry 3.0.......................................................................................................................100
总 结.....................................................................................................................................102
参 考 练 习......................................................................................................................... 102
第十七部分:构造"回调"的另一种方法....................................................................................102
简介.......................................................................................................................................102
简要回顾生成器................................................................................................................... 102
内联回调...............................................................................................................................104
进一步讨论内联回调........................................................................................................... 105
客户端 7.0............................................................................................................................. 107
讨论.......................................................................................................................................108
总结.......................................................................................................................................109
第十八部分:Deferreds 全貌..................................................................................................... 109
简介.......................................................................................................................................109
DeferredList...........................................................................................................................110
客户端 8.0............................................................................................................................ 113
讨论.......................................................................................................................................114
第十九部分:改变之前的想法................................................................................................... 115
简介.......................................................................................................................................115
取消 Deferreds..................................................................................................................... 116
本质上取消 Deferreds......................................................................................................... 118
诗歌代理 3.0........................................................................................................................ 121
另一个难点........................................................................................................................... 123
讨论.......................................................................................................................................125
展望未来...............................................................................................................................125
参考练习...............................................................................................................................125
第二十部分:轮子中的轮子: Twisted 和 Erlang........................................................................125
简介.......................................................................................................................................126
回顾回调...............................................................................................................................126
一个 Erlang 诗歌代理.......................................................................................................... 129
讨论.......................................................................................................................................133
进一步阅读........................................................................................................................... 133
建议练习(为高度热情的人).................................................................................................133
第二十一部分:惰性不是迟缓: Twisted 和 Haskell.................................................................. 134
简介.......................................................................................................................................134
F —— 功能性......................................................................................................................134
Haskell 诗歌.........................................................................................................................136
讨论与进一步阅读............................................................................................................... 138
Twisted
Twisted
第一部分:Twisted
Twisted 理论基础
前言前言前言前言::::
最近有人在 Twisted 邮件列表中提出诸如”为任务紧急的人提供一份 Twisted 介绍”的的需求。
值得提前透露的是,这个序列并不会如他们所愿.尤其是介绍 Twisted 框架和基于 Python 的
异步编程而言,可能短时间无法讲清楚。因此,如果你时间紧急,这恐怕不是你想找的资料。
我相信如果对异步编程模型一无所知,快速的介绍同样无法让你对其有所理解,至少你得稍
微懂点基础知识吧。我已经用 Twisted 框架几年了,因此思考过我当初是怎么学习它(学得很
慢)并发现学习它的最大难度并不在 Twisted 本身,而在于对其模型的理解,只有理解了这个
模型,你才能更好去写和理解异步程序的代码。大部分 Twisted 的代码写得很清晰,其在线
文档也非常棒(至少在开源软件这个层次上可以这么说)。但如果不理解这个模型,不管是
读 Twisted 源码还是使用 Twisted 的代码更或者是相关文档,你都会感到非常的伤脑筋。
因此,我会用前面几个部分来介绍这个模型以让你掌握它的机制,稍后会介绍一下 Twisted
的特点。实际上,一开始,我们并不会使用 Twisted,相反,会使用简单的 Python 来说明一
个异步模型是如何工作的。我们在初次学习 Twisted 的时,会从你平常都不会直接使用的底
层的实现讲起。Twisted 是一个高度抽象的体系,因此在使用它时,你会体会到其多层次性。
但当你去学习尤其是尝试着理解它是如何工作时,这种为抽像而带来的多层次性会给你带来
极大的理解难度。所以,我们准备来个从内到外,从低层开始学习它。
模型:模型:模型:模型:
为 了更好的理解异步编程模型的特点,我们来回顾一下两个大家都熟悉的模型。在阐述过
程中,我们假设一个包含三个相互独立任务的程序。在此,除了规定这些任务 都要完成自
己工作外,我们先不作具体的解释,后面我们会慢慢具体了解它们。请注意:在此我用“任
务”这个词,这意味着它需要完成一些事情。
第一个模型是单线程的同步模型,如图 1 所示:
图 1 同步模型
这是最简单的编程方式。在一个时刻,只能有一个任务在执行,并且前一个任务结束后一个
任务才能开始。如果任务都能按照事先规定好的顺序执行,最后一个任务的完成意味着前面
所有的任务都已无任何差错地完成并输出其可用的结果—这是多么简单的逻辑。
下面我们来呈现第二个模型,如图 2 所示:
图 2 线程模型
在这个模型中,每个任务都在单独的线程中完成。这些线程都是由操作系统来管理,若在多
处理机、多核处理机的系统中可能会相互独立的运行,若在单处理机上,则会交错运行。 关
键点在于,在线程模式中,具体哪个任务执行由操作系统来处理。但编程人员则只需简单地
认为:它们的指令流是相互独立且可以并行执行。虽然,从图示看起来 很简单,实际上多
线程编程是很麻烦的,你想啊,任务之间的要通信就要是线程之间的通信。线程间的通信那
不是一般的复杂。什么邮箱、通道、共享内存、、、 唉:(
一些程序用多处理机而不是多线程来实现并行运算。虽然具体的编程细节是不同的,但对于
我们要研究的模型来说是一样的。
下面我们来介绍一下异步编程模型,如图 3 所示
图 3 异步模型
在这个模型中,任务是交错完成,值得注意的是:这是在单线程的控制下。这要比多线程模
型简单多了,因为编程人员总可以认为只有一个任务在执行,而其它的在停止状态。虽然在
单处理机系统中,线程也是像图 3 那样交替进行。但作为程序员在使用多线程时,仍然需要
使用图 2 而不是图 3 的来思考问题,以防止程序在挪到多处理机的系统上无法正常运行(考
虑到兼容性)。间单线程的异步程序不管是在单处理机还是在多处理机上都 能很好的运行。
在异步编程模型与多线程模型之间还有一个不同:在多线程程序中,对于停止某个线程启动
另外一个线程,其决定权并不在程序员手里而在操作系统那里,因此,程 序员在编写程序
过程中必须要假设在任何时候一个线程都有可能被停止而启动另外一个线程。相反,在异步
模型中,一个任务要想运行必须显式放弃当前运行的任务 的控制权。这也是相比多线程模
型来说,最简洁的地方。
值得注意的是:将异步编程模型与同步模型混合在同一个系统中是可以的。但在介绍中的绝
大多数时候,我们只研究在单个线程中的异步编程模型。
动机动机动机动机::::
我 们已经看到异步编程模型之所以比多线程模型简单在于其单令流与显式地放弃对任务的
控制权而不是被操作系统随机地停止。但是异步模型要比同步模型复杂得多。 程序员必须
将任务组织成序列来交替的小步完成。因此,若其中一个任务用到另外一个任务的输出,则
依赖的任务(即接收输出的任务)需要被设计成为要接收系列 比特或分片而不是一下全部
接收。由于没有实质上的并行,从我们的图中可以看出,一个异步程序会花费一个同步程序
所需要的时间,可能会由于异步程序的性能问 题而花费更长的时间。
因此,就要问了,为什么还要使用异步模型呢? 在这儿,我们至少有两个原因。首先,如
果有一到两个任务需要完成面向人的接口,如果交替执行这些任务,系统在保持对用户响应
的同时在后台执行其它的任务。因此,虽然后台的任务可能不会运行的更快,但这样的系统
可能会欢迎的多。
然而,有一种情况下,异步模型的性能会高于同步模型,有时甚至会非常突出,即在比较短
的时间内完成所有的任务。这种情况就是任务被强行等待或阻塞,如图 4 所示:
图 4 同步模型中出现阻塞
在图 4 中,灰色的部分代表这段时间某个任务被阻塞。为什么要阻塞一个任务呢?最直接的
原因就是等待 I/O 的完成:传输数据或来自某个外部设备。一个典型的 CPU 处理数据的能
力是硬盘或网络的几个数量级的倍数。因此,一个需要进行大 I/O 操作的同步程序需要花费
大量的时间等待硬盘或网络将数据准备好。正是由于这个原因,同步程序也被称作为阻塞程
序。
从图 4 中可以看出,一个可阻塞的程序,看起来与图 3 描 述的异步程序有点像。这不是个
巧合。异步程序背后的最主要的特点就在于,当出现一个任务像在同步程序一样出现阻塞时,
会让其它可以执行的任务继续执行,而 不会像同步程序中那样全部阻塞掉。因此一个异步
程序只有在没有任务可执行时才会出现“阻塞”,这也是为什么异步程序被称为非阻塞程序的
原因。
任务之间的切换要不是此任务完成,要不就是它被阻塞。由于大量任务可能会被阻塞,异步
程序等待的时间少于同步程序而将这些时间用于其它实时工作的处理(如与人打交道的接
口),这样一来,前者的性能必然要高很多。
与同步模型相比,异步模型的优势在如下情况下会得到发挥:
1.有大量的任务,因此在一个时刻至少有一个任务要运行
2.任务执行大量的 I/O 操作,这样同步模型就会在因为任务阻塞而浪费大量的时间
3.任务之间相互独立,以至于任务内部的交互很少。
这些条件大多在 CS 模式中的网络比较繁忙服务器端出现(如 WEB 服务器)。每个任务代表
一个客户端进行接收请求并回复的 I/O 操作。客户的请求(相当于读操作)都是相互独立的。
因此一个网络服务是异步模型的典型代表,这也是为什么 twisted 是第一个也是最棒的网络
库。
reactor
reactor
第二部分:异步编程初探与 reactor
reactor 模式
第二部分:低效的诗歌服务器来启发对 Twisted 机制的理解
这个系列是从这里开始的,欢迎你再次来到这里来。现在我们可能要写一些代码。在开始之
前,我们都做出一些必要的假设。