python twisted教程一,异步编程
前言
最近有人在twisted郵件列表中問有沒有一個可以讓人快速學(xué)習(xí)twisted的文檔.總體的來說:這個系列不是這樣的一個文檔.如果你沒有很多時(shí)間或者耐心的話,這個系列的文章不太適合你.
不過,如果你對異步編程了解很少的話,相信一個簡短的介紹也不讓你完全明白,當(dāng)然如果你是天才除外.我學(xué)習(xí)和使用twisted已經(jīng)好幾年了,通過這幾年的學(xué)習(xí)和工作我得出的結(jié)論就是:學(xué)習(xí)twisted困難的地方就是對異步編程的理解而不是怎樣去用twisted 的函數(shù)去寫代碼. twisted 的代碼寫的都很簡潔和清晰,而且有很好的注釋和文檔,但是如果沒有理解異步編程的思想而直接去讀twisted 的源碼的話會讓你有twisted 的感覺.
這個系列的第一篇會講異步編程,后面的章節(jié)才會降到twisted.首先讓我們以一個簡單的實(shí)例來說明異步編程是怎么工作的吧.
模型
為了更好的理解異步模型,我們先來回顧一下我們經(jīng)常遇到的一些模型:同步模型和多線程模型.讓我們假想一個程序要完成三個任務(wù),先讓我們看看同步模型是怎么來工作的,如下圖,
圖片一
這個是最簡單的執(zhí)行任務(wù)的方式,也是我們在平常寫程序的時(shí)候經(jīng)常用到的,完成一項(xiàng)工作之后再去做另外一件事情,每次只執(zhí)行一項(xiàng)任務(wù).
我們可以比較同步模型多線程模型,如下圖:
?
圖片二
在這種模型當(dāng)中,每一個任務(wù)被分配在單獨(dú)的線程當(dāng)中工作,多個任務(wù)可以同時(shí)進(jìn)行,這種模型下,每個任務(wù)是被認(rèn)為是獨(dú)立的.但是在現(xiàn)實(shí)中,很多時(shí)候每個線程并不是獨(dú)立,在運(yùn)行的過程中需要從其他的線程中去獲取結(jié)果,這樣就使各個進(jìn)行的交互和協(xié)作變得復(fù)雜,在一個大的系統(tǒng)中,進(jìn)程之間的交互會更復(fù)雜.
最后是我們要講的異步模型.如下圖
圖片三
在異步模型中,每個任務(wù)進(jìn)行交替進(jìn)行,但是仍在一個進(jìn)程中.異步模型會比多線程模型更簡單些,因?yàn)槊總€任務(wù)的運(yùn)行狀態(tài)都是可以被我們控制的.雖然在同步模型也可以讓任務(wù)交替運(yùn)行,但這往往需要多個線程協(xié)作才能完成.單線程異步模式可以保證程序運(yùn)行在一個線程中,即使在一個多進(jìn)程系統(tǒng)中.
異步模型和多線程模型還有一個不同的地方是,多線程除了程序的控制之外,還受到操作系統(tǒng)的控制.
相反的在一個異步模型的程序中,一個任務(wù)會一直運(yùn)行下去,直到任務(wù)被運(yùn)行完或者程序暫停這個任務(wù)而去執(zhí)行令一個任務(wù).
重要的一點(diǎn)是,在異步模型可以多線程模型可以很好結(jié)合起來,但在這個系列教程中我們還只涉及到異步模型.
為什么(為毛)
從上面的講解中我們可以看到異步模型比多線程模型更簡單些,因?yàn)楫惒侥P椭挥幸粋€進(jìn)程而且任務(wù)的停止和運(yùn)行狀態(tài)是可控的.但比同步模型相比還是比較復(fù)雜,程序員必須把每一個任務(wù)分成很多步然后再有序的把他們組合起來,如果一個任務(wù)用到了令一個任務(wù)的結(jié)果,這個任務(wù)需要接受另一個任務(wù)的輸出做為他自己的輸入,而且這種接收的數(shù)據(jù)經(jīng)常是一段一段的而不是一個整體. 你不禁要問既然異步模型和同步模型都是一個線程,他們執(zhí)行相同的任務(wù)應(yīng)該花費(fèi)相同的時(shí)間啊,甚至比同步模型花費(fèi)的時(shí)間更多,為什么要才采用異步的模型呢?
這里最少有兩個原因,第一,如果多個任務(wù)中的一個任務(wù)負(fù)責(zé)實(shí)現(xiàn)一個人機(jī)交互接口,在等待用戶輸入的時(shí)候,可以讓其他的任務(wù)先去執(zhí)行,等用戶輸入時(shí)再去處理用戶的輸入.
所以如果說異步模型比同步模型快的話是有條件限制的,如果你的程序中會有阻塞,或者被強(qiáng)迫等待,異步模型會是你的選擇.同步模型在有阻塞的時(shí)候的執(zhí)行過程應(yīng)該是這樣的
圖片四
在這個圖中灰色的部分代表了一個任務(wù)正在等待(阻塞). 為什么一個任務(wù)會被阻塞呢? 一個經(jīng)常的原因就是等待執(zhí)行I/O ,傳輸數(shù)據(jù). 一般來說CPU 處理數(shù)據(jù)的速度比磁盤和網(wǎng)絡(luò)塊,因此當(dāng)一個同步的程序要處理很多I/O時(shí)會花費(fèi)很多時(shí)間用于等待,這樣的一個同步程序也被叫做”阻塞程序”
注意圖片4,一個阻塞程序,有點(diǎn)像圖片3,一個異步程序.這不是一個巧合,異步模型的設(shè)計(jì)原理就是,當(dāng)其中一個任務(wù)被阻塞時(shí),可以先去執(zhí)行其他的可以執(zhí)行的任務(wù).所以一個異步程序僅僅會在沒有任務(wù)可以執(zhí)行的時(shí)候,所以一個異步程序也會被叫做無阻塞程序.如果一個程序中有很多阻塞的任務(wù),異步模型可以比同步模型更高效.
和同步模型相比,異步模型在下列情況時(shí)表現(xiàn)更好:
1,有很多任務(wù),經(jīng)??傆幸粋€任務(wù)可以繼續(xù)執(zhí)行的時(shí)候
2,這些任務(wù)中要執(zhí)行很多I/O操作
3,這些任務(wù)大多都是獨(dú)立的
這些情況大都描述了一個非常繁忙的web server,每一個任務(wù)代表了一次接收請求和發(fā)送結(jié)果,而這些client 請求大多都是獨(dú)立的,所以一個web server 的實(shí)現(xiàn)一個很好的異步模型的實(shí)現(xiàn),這就是twisted被叫做網(wǎng)絡(luò)編程庫.
Onward and Upward
這個系列的第一個部分就完啦,在第二部分,我們將寫一些網(wǎng)絡(luò)程序,阻塞的和非阻塞的都有,沒有用twisted.讓我們先體會一下一個異步的程序是怎樣運(yùn)行的.
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的python twisted教程一,异步编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyMongo官方文档翻译——VNPY
- 下一篇: linux常用命令(精)