twisted學習(deferred機制)

    一、在異步編程中,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

相關文章
相關標籤/搜索