2010年2月27日星期六

[Twisted学习笔记] Deferred机制

参考阅读:
[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 Reference中的相关段落]
  • 当请求得到结果后, 如果操作成功, 会通过Deferred.callback(result)传递到Deferred Object; 如果失败则通过Deferred.errback(failure).
  • Deferred Object将结果传递给此前注册的回调函数链, 规则如下:
    • 一个callback的输出总是作为下一个callback的第一个参数, 这样就构成了一个处理器链.
    • 如果一个callback产生异常, 则立即转到下一个errback.
    • 如果errback内部产生了异常, 则转到下一个errback.
    • 如果errback没有产生异常, 或者返回了一个twisted.python.failure.Failure实例, 则回到下一个callback.








上图可能会有些误导性, 我又画了一幅示意图:

deferred