Twisted框架


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM