twisted學習(三):Deferred

1. Deferred介紹

Deferred的Twisted抽象出來的一對回調鏈, 一個是處理正確的結果,一個是處理異常的結果。也就是可以向Deferred對象中添加callback和errback。然後可以用正確的或異常的結果來激活Deferred。激活後的Deferred就按照我們添加的順序激活callback或errback.

twisted學習(三):Deferred

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調用。


分享到:


相關文章: