[1] Deferred Reference
[2] Deferreds are beautiful! (A Tutorial)
最近在研究Twisted, 其中一个会把像我这样的初学者吓住的概念就是Deferred.
我们知道, Twisted是一个异步(asynchronous)的基于事件回调(callback-based)的框架, 而Deferred是实现这一特性的关键之一.
Twisted使用Deferred对象来管理回调函数序列(callback sequence).
具体来说:
1) 通过Deferred对象可以为某个事件增加一个或多个事件处理函数(即回调函数);
2) 多个回调函数构成了函数链(callback chain);
3) 增加回调函数的顺序决定了事件响应的"相对顺序";
4) 增加回调函数的方式决定了回调函数的调用时机.
当Deferred对象的请求得到满足, 添加的第一个callback会被调用, 并且其输出会作为第二个callback的输入, 然后像这样沿着函数链依次传递下去. 如下图所示:
- 当请求得到结果后, 如果操作成功, 会通过Deferred.callback(result)传递到Deferred Object; 如果失败则通过Deferred.errback(failure).
- Deferred Object将结果传递给此前注册的回调函数链, 规则如下:
- 一个callback的输出总是作为下一个callback的第一个参数, 这样就构成了一个处理器链.
- 如果一个callback产生异常, 则立即转到下一个errback.
- 如果errback内部产生了异常, 则转到下一个errback.
- 如果errback没有产生异常, 或者返回了一个
twisted.python.failure.Failure实例, 则回到下一个callback.
上图可能会有些误导性, 我又画了一幅示意图: