1. Deferred介紹
Deferred的Twisted抽象出來的一對回調鏈, 一個是處理正確的結果,一個是處理異常的結果。也就是可以向Deferred對象中添加callback和errback。然後可以用正確的或異常的結果來激活Deferred。激活後的Deferred就按照我們添加的順序激活callback或errback.
2.Deferred單獨使用
from twisted.internet.defer import Deferred
def normal(result):
print 'i am normal'
print result
def failed(err):
print 'failed!'
d = Deferred()
d.addCallbacks(normal,failed)
d.callback('right')
print 'finish'
結果:
i am normal
right
finish
from twisted.internet.defer import Deferred
from twisted.python.failure import Failure
def normal(result):
print 'i am normal'
print result
def failed(err):
print 'failed!'
d = Deferred()
d.addCallbacks(normal, failed)
d.errback(Failure(Exception('i have failed')))
print 'finish'
結果:
failed!
finish
Deferred需要顯示創建對象,而沒有啟用reactor。通過addCallbacks添加callback和errback回調函數。使用callback激活deferred對象。
注意:
1. Deferred需要添加回調函數對,方法有addCallbacks(callback, errback),或addCallback(callback)和addErrback(errback)同時使用,還可以使用addBoth(callback),這裡callback即作為正確回調也做為錯誤回調。
2.callback函數傳遞正確的結果.errback函數傳遞錯誤的結果
3.Failure作為錯誤的對象,也可以傳入Exception對象,自動轉化成Failure
4. Deferred只能激活一次
3.reactor使用Deferred
針對一個例子修改如下:
from twisted.internet.defer import Deferred
from twisted.python.failure import Failure
from twisted.internet import reactor
def normal(result):
print 'i am normal'
print result
def failed(err):
print 'failed!'
def finish(_):
print 'finish'
reactor.stop()
d = Deferred()
d.addCallbacks(normal, failed)
d.addBoth(finish)
reactor.callWhenRunning(d.callback, 'right')
reactor.run()
結果
i am normal
right
這裡使用ractor的callWhenRunning激活的deferred對象。而且在deferred對象中添加了兩個回調函數對,真正使用了回調函數鏈。注意finish函數參數使用_,表示參數不會使用,但是還必須有一個參數。
4. 總結
1.Deferred是需要添加回到函數對的,即callback和errback
2.Deferred只能調用一次
3.Deferred激活方式自身調用callback函數,也可以通過reactor調用。
閱讀更多 用數說話 的文章