一、在異步編程中,defer機制主要是用來管理callback函數,在twisted中,許多功能的實現都是採用的事件驅動機制,在異步編程中,錯誤處理機制和同步程序並不同,異步程序會無視錯誤執行下去。在異步程序中處理錯誤顯得十分重要。defer就是來能夠幫助咱們來管理咱們的callback和errback函數。合理的安排defer在異步編程中顯得十分重要。 python
二、一個deferred包含有一對callback鏈,一個用於處理正常的狀況,一個用於處理異常狀況。每一對鏈都是一個互斥關係,也就是說,當callback執行了,那麼errback就不會執行了。一樣,errback執行了,那麼callback不會執行 編程
from twisted.internet.defer import Deferred def successHandle(result): print 'It is success:' print result def failedHandle(reason): print 'Error.' d = Deferred() # add a callback/errback pair to the chain d.addCallbacks(successHandle, failedHandle) # fire the chain with a normal result d.callback('Successful') print "Finished"
輸出的結果以下
It is success: Successful Finished 異步
能夠看到,這裏使用defer成功的調用了successHandle()函數來處理正常的狀況。若是想處理錯誤的狀況,將d.callback('Successful')修改爲errback('Error'),errback的參數是一個Failure類型。因此,錯誤處理以下: 異步編程
from twisted.internet.defer import Deferred from twisted.python.failure import Failure def successHandle(result): print 'It is success:' print result def failedHandle(reason): print 'Error.' d = Deferred() # add a callback/errback pair to the chain d.addCallbacks(successHandle, failedHandle) # fire the chain with a normal result d.errback(Failure(Exception('It is Error!'))) print "Finished"
咱們能夠使用deferreds來搞定普通的Exceptions,Failusers能夠幫咱們自動處理,咱們不用去考慮,並且deferred將保證每次errback是隨着Failure實例調用的。看下面的代碼: 函數
from twisted.internet.defer import Deferred def out(s): print s d = Deferred() d.addCallbacks(out, out) d.callback('First result') d.callback('Second result') print 'Finished'
你會發現只會打印一個,第二次則不會打印出來,也就是說,同一個callback只能被調用一次。 code