作者StubbornLin (Victor)
看板Python
标题[教学] Twsited的骨干 : Deferred
时间Fri Jul 18 15:54:58 2008
接着来介绍Twsited的骨干 : Deferred
这个东西在不了解它时也是一样令人觉得有点混乱
但是了解它之後其实也是很简单的一样东西
如果要我用最简单的描述来说明Deferred,我会说
就是callback的机制
但是它不单单只是callback的机制,还加了责任链(design pattern)的概念在里面
这个设计让它可以很容易的串来串去,像串烧一样容易 XD
我们来看一下简单的Deferred物件的使用例子
def sayHelloIn3Seconds():
# create a deferred object
d = defer.Deferred()
def sayHello():
print 'hello'
# notify user
d.callback(None)
# call say hello 3 seconds later
reactor.callLater(3, sayHello)
return d
对於我们而言,sayHelloIn3Seconds是一个非同步的函数
这类的函数在Twsited里都会回传Deferred物件,而这个函数呼叫
它会负责设计让它在完成任务後通知我们,方法就是透过它回传来的Deferred物件
呼叫Deferred物件的callback函数就会呼叫它的callback链
使用的例子可能会像这样
def helloFinish(result):
print 'done.'
d = sayHelloIn3Seconds()
d. addCallback(helloFinish)
addCallback的用意是增加callback函数到callback链里
所以当这个函数完成了三秒後sayHello的非同步工作
它就会透过deferred物件来通知我们
所有Twsited的非同步工作都是靠这样来让我们得知
并且处理资料的
它的运作方式长得像这个样子
执行完成,或发生错误
╱\
╱ \
↙ ↘
callback errback
│\ ╱│
│ \ ╱ │
│ ╳ │
│ ╱ \ │
↓↙ ↘↓
callback errback
│\ ╱│
│ \ ╱ │
│ ╳ │
│ ╱ \ │
↓↙ ↘↓
callback errback
这图的意思是
当工作完成时,它会呼叫callback这边的函数,把非同步函数的result
丢给callback去处理,而每个callback的回传值,又都会丢给下一个callback
当发生错误时,会呼叫errback这边的函数,把error(Failure object)
丢给errback去处理,而每个errback的回传值,又会丢给下一个errback处理
而callback中发生错误(丢出例外),或是回传Failure object的话
就会丢给下一层的errback去处理
而errback中发生错误,或是回传Failure object的话,也是会丢给下一层errback
但是如果当回传的值不是Failure object
就会跳到下一层的callback去处理
接下来介绍这些串烧是如何的美味和容易 XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.170.5.243
1F:推 blc:请问helloFinish是被addCallback丢到sayHello的callback里吗? 07/25 22:35