twisted 学习路线
core
reactor.run() select.select(rlist, wlist, xlist[, timeout])
低阶实现
reactor.addreader()
reactor.addwriter()
抽象与复用
protocol 传输过程控制
factory 断链、连接失败。代码、数据共享
异步抽象deferred
factory 传入回调函数,传入deferred
回调链、异常处理
deferred的回调链层级,传递路径,使用惯例
deferred.addCallbacks()
deferred.addCallback()
deferred.addErrback()
deferred.addBoth()
fire
reactor.callWhenRunning()
reactor.callLater()
deferred.callback()
deferred.errback()
deferred嵌套
由于外层的deferred需要调用回调链中下一个callback或errback并将回调N的结果传下去,因此,其必须等待直到内层deferred被激活。
外层的deferred不可能处于阻塞状态,因为控制权此时已经转交给了reactor并且阻塞了
当内层deferrd被激活时,外层的deferred恢复其回调链的执行。当内层deferred回调执行成功,那么外层deferred会调用第N+1个callback回调。相反,如果内层deferred执行失败,那么外层deferred会调用第N+1个errback回调。
deferred用于同步环境(返回前激活)
可以在将Deferred返回前就激活这个Deferred
可以在一个已经激活的deferred上添加回调处理函数
maybeDeferred会将该值重新打包成一个已经激活的deferred返回
defer.succeed
defef.fail
进程守护
IService 接口定义了一个可以启动或停止的服务
这边有两个需要的属性: name 和 running.其中 name 属性是一个字符串,如 "myservice",如果你不想给这个服务起名字也可为None .running 属性是 Boolean 变量,如果服务成功启动,值为 True.
startService()
stopService()
setServiceParent(parent)
IServiceCollection
通过名字查找某服务( getServiceNamed )
遍历集合中的服务( __iter__)
添加一个服务到集合( addService)
从集合中移除一个服务( removeService)
Application 对象需要实现 IService 和 IServiceCollection 接口以及一些我们未曾涉及的接口
application = service.Application("AppName")
tac 文件是一个 Twisted Application Configuration 文件,它告诉 twistd 怎样去构建一个应用.作为一个配置文件,它负责选择设置(如端口,诗歌文件位置,等)来以一种特定的方式运行这个应用.
任何Twisted插件都需要实现 twisted.plugin.IPlugin 接口. 如果你浏览这个接口的声明, 你会发现它没有指定任何方法
一个实现了IServiceMaker 接口的对象知道如何创建 IService,它将成为运行程序的核心. IServiceMaker 指定了三个属性和一个方法
tapname: 代表插件名字的字符串. "tap"代表"Twisted Application Plugin". 注:老版本的Twisted还使用"tapfiles"文件,不过这个功能现在已经取消了.
description: 插件的描述, twistd 将以它作为帮助信息输出.
options: 一个代表这个插件接受的命令行选项的对象.
makeService: 一个创建 IService 对象的方法,需提供一些特定的命令行选项.
implements(service.IServiceMaker, IPlugin)
生成器
生成器(和迭代器)通常被用来代表以惰性方式创建的值序列
当你再次启动生成器时,可以给它发送信息
val = yield 2
gen.send(20)
gen.throw(Malfunction())
@inlineCallbacks
装饰函数本身是异步的,所以 deferred 是一个合适的返回值,这个返回的 deferred 不是生成器中 yield 生成的 deferred
defer.returnValue
deferredlist
DeferredList 是以一个 deferred 对象列表创建的.
DeferredList 本身是一个 deferred,它返回的结果是一个列表,长度与 deferred 列表相同.
当原始列表中所有 deferred 被激发后, DeferredList 将会被激发.
结果列表中的每个元素以相同顺序对应原始列表中相应的 deferred.如果那个 deferred 成功返回,相应元素是(True,result),如果失败则为(False,failure).
DeferredList 不会失败,因为无论每个 deferred 的返回结果是什么都会被集总到结果列表中
将 consumeErrors=True 传递给 DeferredList, 它将向每个 deferred 添加返回 None 的错误回调, 即"消耗"掉这个错误并且取消警告信息
异步导致的请求和响应的解耦,同时带来了取消响应的问题
deferred的cancellation
d.cancel() 可以屏蔽deferred的响应,无法取消操作
twisted.internet.defer.CancelledError
defer.Deferred(canceller) 需要完成取消操作,需依仗canceller
取消一个 deferred 时,你可能不是在取消主异步操作,而是一些其他的作为前者结果所触发的异步操作
思想
异步I/O,将大规模数据流分割为小块处理 惰性计算,Haskell
Only process as much data as you have Only process as much data as you need