Twisted是一個事件驅動型的網絡模型。時間驅動模型編程是一種范式,這里程序的執行流由外部決定。特點是:包含一個事件循環,當外部事件發生時,使用回調機制來觸發相應的處理。
線程模式:
1.單線程同步模型,任務按照順序執行。如果某個任務因為IO阻塞,其他所有的任務都必須等待,直到完成才能執行,但如果任務之間沒有相互等待的話,就使得程序不必要的降低了運行速度。
2.多線程,線程是由操作系統來管理的,在多處理器系統上交錯執行。這使得單個線程阻塞在某個資源的同時其他線程可以繼續執行,與完成類似功能的同步程序比,這種方式更有效,但程序猿必須自己寫代碼保護共享資源,防止其被多個線程同時訪問。多線程程序更加難以推斷,因為這類程序不得不通過線程的同步機制如鎖、可重入函數、線程局部存儲或者其他機制來處理線程安全問題,如果實現不當就會出現bug
3.事件驅動模型中,如果有三個任務交錯執行,但是仍然在一個單獨的線程控制中,當處理IO或者其他昂貴的操作時,注冊一個回調到事件循環中,然后當IO操作完成之后繼續執行,回調描述來該如何處理某個事件,這可以使得程序盡可能的得以執行而不需要用到額外的線程,並且程序員也不需要專心線程安全問題。
Reactor模塊
反應堆,Twisted的核心就是reactor的事件循環,Reactor可以感知網絡、文件系統以及定時器事件。他等待然后處理這些事件,從特定的平台的行為中抽象出來,並提供統一的接口,使得在網絡協議棧的任何位置對事件做出相應都變得簡單。
目前的在所有平台的默認Reactor都是基於poll API的。
阻塞調用是指調用結果返回之前,當前線程會被刮起,函數只有在得到結果之后才會返回。
非阻塞調用,比如read信息,如果緩沖區沒有數據,則立刻返回,不會等待數據到來。
Deferreds
Deferreds對象包含一堆回調鏈,一個是針對操作成功的回調,一個是針對操作失敗的回調。初始常態下Deferred的兩條鏈都是空的,在事件處理的過程中,每個階段都為其添加處理成功和處理失敗的回調。當一個異步結果到來時,Deferred對象就像是被激活,那么處理成功的回調和處理失敗的回調就可以以合適的方式按照她們添加進來的順序依次調用。
from twisted.internet import reactor import getPage def processPage(page): print page def logError(error): print error def finishProcessing(value): print "Shutting down..." reactor.stop() url = "http://google.com" deferred = getPage(url) # getPage returns a Deferred deferred.addCallbacks(success, failure) deferred.addBoth(stop) reactor.run()
Deferred對象創建時包含兩個添加回調的階段,第一階段,addcallback將processpage和logerror添加到他們各自歸屬的回調鏈中,然后addboth再將finishprocessing同時添加到這兩個回調鏈中。
Transports
Transports代表網絡中兩個通信結點之間的連接。Transports負責描述連接的細節,比如連接是面向流式的還是面向數據報的,流控以及可靠性。TCP、UDP和Unix套接字可作為transports的例子。它們被設計為“滿足最小功能單元,同時具有最大程度的可復用性”,而且從協議實現中分離出來,這讓許多協議可以采用相同類型的傳輸。Transports實現了ITransports接口,它包含如下的方法:
write 以非阻塞的方式按順序依次將數據寫到物理連接上
writeSequence 將一個字符串列表寫到物理連接上
loseConnection 將所有掛起的數據寫入,然后關閉連接
getPeer 取得連接中對端的地址信息
getHost 取得連接中本端的地址信息
Protocols
Protocols描述了如何以異步的方式處理網絡中的事件。
makeConnection 在transport對象和服務器之間建立一條連接
connectionMade 連接建立起來后調用
dataReceived 接收數據時調用
connectionLost 關閉連接時調用
Service
Service就是IService接口下實現的可以啟動和停止的組件。Twisted自帶有TCP、FTP、HTTP、SSH、DNS等服務以及其他協議的實現。其中許多Service都可以注冊到單獨的應用中。IService接口的核心是:
startService 啟動服務。可能包含加載配置數據,設定數據庫連接或者監聽某個端口
stopService 關閉服務。可能包含將狀態保存到磁盤,關閉數據庫連接或者停止監聽端口
我們的Echo服務使用TCP協議,因此我們可以使用Twisted中IService接口下默認的TCPServer實現。
Application
Application是處於最頂層的Service,代表了整個Twisted應用程序。Service需要將其自身同Application注冊,然后就可以用下面我們將介紹的部署工具twistd搜索並運行應用程序。我們將創建一個可以同Echo Service注冊的Echo應用。