gevent和twisted對比

Twisted

在事件驅動版本的程序中,3個任務交錯執行,但仍然在一個單獨的線程控制中。當處理I/O或者其餘昂貴的操做時,註冊一個回調到事件循環中,而後當I/O操做完成時繼續執行。回調描述了該如何處理某個事件。事件循環輪詢全部的事件,當事件到來時將它們分配給等待處理事件的回調函數。這種方式讓程序儘量的得以執行而不須要用到額外的線程。事件驅動型程序比多線程程序更容易推斷出行爲,由於程序員不須要關心線程安全問題。nginx

Gevent

當前協程繁忙時,主動的放棄CPU資源,等到之後再運行。程序員

協程和事件驅動:

最近在研究網絡服務框架方面的東西,發現了一個神奇的東西-協程。 
一句話說明什麼是線程:協程是一種用戶態的輕量級線程。 
從硬件發展來看,從最初的單核單CPU,到單核多CPU,多核多CPU,彷佛已經到了極限了,可是單核CPU性能卻還在不斷提高。server端也在不斷的發展變化。若是將程序分爲IO密集型應用和CPU密集型應用,兩者的server的發展以下: 
IO密集型應用: 多進程->多線程->事件驅動->協程 
CPU密集型應用:多進程–>多線程 
若是說多進程對於多CPU,多線程對應多核CPU,那麼事件驅動和協程則是在充分挖掘不斷提升性能的單核CPU的潛力編程

同步和異步的比較

不管是線程仍是進程,使用的都是同步進制,當發生阻塞時,性能會大幅度下降,沒法充分利用CPU潛力,浪費硬件投資,更重要形成軟件模塊的鐵板化,緊耦合,沒法切割,不利於往後擴展和變化。不論是進程仍是線程,每次阻塞、切換都須要陷入系統調用(system call),先讓CPU跑操做系統的調度程序,而後再由調度程序決定該跑哪個進程(線程)。多個線程之間在一些訪問互斥的代碼時還須要加上鎖,這也是致使多線程編程難的緣由之一。 
現下流行的異步server都是基於事件驅動的(如nginx)。事件驅動簡化了編程模型,很好地解決了多線程難於編程,難於調試的問題異步事件驅動模型中,把會致使阻塞的操做轉化爲一個異步操做,主線程負責發起這個異步操做,並處理這個異步操做的結果。因爲全部阻塞的操做都轉化爲異步操做,理論上主線程的大部分時間都是在處理實際的計算任務,少了多線程的調度時間,因此這種模型的性能一般會比較好。 
總的說來,當單核cpu性能提高,cpu不在成爲性能瓶頸時,採用異步server可以簡化編程模型,也能提升IO密集型應用的性能。windows

協程和線程

以前說道,協程是一種用戶級的輕量級線程。協程擁有本身的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。所以: 
協程能保留上一次調用時的狀態(即全部局部狀態的一個特定組合),每次過程重入時,就至關於進入上一次調用的狀態,換種說法:進入上一次離開時所處邏輯流的位置。 
在併發編程中,協程與線程相似,每一個協程表示一個執行單元,有本身的本地數據,與其它協程共享全局數據和其它資源。等待線程會搶佔cpu,而協程會主動放棄cpu。不論是進程仍是線程,每次阻塞、切換都須要陷入系統調用(system call),先讓CPU跑操做系統的調度程序,而後再由調度程序決定該跑哪個進程(線程)。 
並且因爲搶佔式調度執行順序沒法肯定的特色,使用線程時須要很是當心地處理同步問題,而協程徹底不存在這個問題(事件驅動和異步程序也有一樣的優勢)。安全

協程和事件驅動

以nginx爲表明的事件驅動的異步server正在橫掃天下,那麼事件驅動模型會是server端模型的終點嗎? 
事件驅動編程的架構是預先設計一個事件循環,這個事件循環程序不斷地檢查目前要處理的信息,根據要處理的信息運行一個觸發函數。其中這個外部信息可能來自一個目錄夾中的文件,可能來自鍵盤或鼠標的動做,或者是一個時間事件。這個觸發函數,能夠是系統默認的也能夠是用戶註冊的回調函數。 
事件驅動程序設計着重於彈性以及異步化上面。許多GUI框架(如windows的MFC,Android的GUI框架),Zookeeper的Watcher等都使用了事件驅動機制。將來還會有其餘的基於事件驅動的做品出現。 
基於事件驅動的編程是單線程思惟,其特色是異步+回調。 
協程也是單線程,可是它能讓原來要使用異步+回調方式寫的非人類代碼,能夠用看似同步的方式寫出來。它是實現推拉互動的所謂非搶佔式協做的關鍵。網絡

總結:

協程的好處:多線程

跨平臺
跨體系架構
無需線程上下文切換的開銷
無需原子操做鎖定及同步的開銷
方便切換控制流,簡化編程模型
高併發+高擴展性+低成本:一個CPU支持上萬的協程都不是問題。因此很適合用於高併發處理。

缺點:架構

沒法利用多核資源:協程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協程須要和進程配合才能運行在多CPU上.固然咱們平常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。
進行阻塞(Blocking)操做(如IO時)會阻塞掉整個程序:這一點和事件驅動同樣,可使用異步IO操做來解決
相關文章
相關標籤/搜索