python twisted教程 一,非同步編程
發佈於: August 17, 2011, 11:45 pm 分類: Twisted 作者: cyrec 閱讀: [214]
轉自:http://www.notedit.com/
原文:http://krondo.com/blog/?p=1209
前言最近有人在twisted郵件清單中問有沒有一個可以讓人快速學習twisted的文檔.總體的來說:這個系列不是這樣的一個文檔.如果你沒有很多時間或者耐心的話,這個系列的文章不太適合你.不過,如果你對非同步編程瞭解很少的話,相信一個簡短的介紹也不讓你完全明白,當然如果你是天才除外.我學習和使用twisted已經好幾年了,通過這幾年的學習和工作我得出的結論就是:學習twisted困難的地方就是對非同步編程的理解而不是怎樣去用twisted 的函數去寫代碼. twisted 的代碼寫的都很簡潔和清晰,而且有很好的注釋和文檔,但是如果沒有理解非同步編程的思想而直接去讀twisted 的源碼的話會讓你有twisted 的感覺.這個系列的第一篇會講非同步編程,後面的章節才會降到twisted.首先讓我們以一個簡單的執行個體來說明非同步編程是怎麼工作的吧.
模型
為了更好的理解非同步模型,我們先來回顧一下我們經常遇到的一些模型:同步模型和多執行緒模式.讓我們假想一個程式要完成三個任務,先讓我們看看同步模型是怎麼來工作的,如,圖片一這個是最簡單的執行任務的方式,也是我們在平常寫程式的時候經常用到的,完成一項工作之後再去做另外一件事情,每次只執行一項任務.我們可以比較同步模型多執行緒模式,如:圖片二在這種模型當中,每一個任務被分配在單獨的線程當中工作,多個任務可以同時進行,這種模型下,每個任務是被認為是獨立的.但是在現實中,很多時候每個線程並不是獨立,在啟動並執行過程中需要從其他的線程中去擷取結果,這樣就使各個進行的互動和協作變得複雜,在一個大的系統中,進程之間的互動會更複雜.最後是我們要講的非同步模型.如圖片三在非同步模型中,每個任務進行交替進行,但是仍在一個進程中.非同步模型會比多執行緒模式更簡單些,因為每個任務的運行狀態都是可以被我們控制的.雖然在同步模型也可以讓任務交替運行,但這往往需要多個線程協作才能完成.單線程非同步模式可以保證程式運行在一個線程中,即使在一個多進程系統中.非同步模型和多執行緒模式還有一個不同的地方是,多線程除了程式的控制之外,還受到作業系統的控制.相反的在一個非同步模型的程式中,一個任務會一直運行下去,直到任務被運行完或者程式暫停這個任務而去執行令一個任務.重要的一點是,在非同步模型可以多執行緒模式可以很好結合起來,但在這個系列教程中我們還只涉及到非同步模型.
為什麼(為毛)
從上面的講解中我們可以看到非同步模型比多執行緒模式更簡單些,因為非同步模型只有一個進程而且任務的停止和運行狀態是可控的.但比同步模型相比還是比較複雜,程式員必須把每一個任務分成很多步然後再有序的把他們組合起來,如果一個任務用到了令一個任務的結果,這個任務需要接受另一個任務的輸出做為他自己的輸入,而且這種接收的資料經常是一段一段的而不是一個整體. 你不禁要問既然非同步模型和同步模型都是一個線程,他們執行相同的任務應該花費相同的時間啊,甚至比同步模型花費的時間更多,為什麼要才採用非同步模型呢?這裡最少有兩個原因,第一,如果多個任務中的一個任務負責實現一個人機互動介面,在等待使用者輸入的時候,可以讓其他的任務先去執行,等使用者輸入時再去處理使用者的輸入.所以如果說非同步模型比同步模型快的話是有條件限制的,如果你的程式中會有阻塞,或者被強迫等待,非同步模型會是你的選擇.同步模型在有阻塞的時候的執行過程應該是這樣的圖片四在這個圖中灰色的部分代表了一個任務正在等待(阻塞). 為什麼一個任務會被阻塞呢? 一個經常的原因就是等待執行I/O ,傳輸資料. 一般來說CPU 處理資料的速度比磁碟和網路塊,因此當一個同步的程式要處理很多I/O時會花費很多時間用於等待,這樣的一個同步程式也被叫做”阻塞程式”注意圖片4,一個阻塞程式,有點像圖片3,一個非同步程式.這不是一個巧合,非同步模型的設計原理就是,當其中一個任務被阻塞時,可以先去執行其他的可以執行的任務.所以一個非同步程式僅僅會在沒有任務可以執行的時候,所以一個非同步程式也會被叫做無阻塞程式.如果一個程式中有很多阻塞的任務,非同步模型可以比同步模型更高效.和同步模型相比,非同步模型在下列情況時表現更好:1,有很多任務,經常總有一個任務可以繼續執行的時候2,這些任務中要執行很多I/O操作3,這些任務大多都是獨立的這些情況大都描述了一個非常繁忙的web server,每一個任務代表了一次接收請求和發送結果,而這些client 請求大多都是獨立的,所以一個web server 的實現一個很好的非同步模型的實現,這就是twisted被叫做網路編程庫.
Onward and Upward這個系列的第一個部分就完啦,在第二部分,我們將寫一些網路程式,阻塞的和非阻塞的都有,沒有用twisted.讓我們先體會一下一個非同步程式是怎樣啟動並執行.