gevent是Python的一個用於網絡IO的函數庫,其中應用到了 coroutine(協同程序) 的思想。首先來了解下目前網絡框架的幾種基本的網絡I/O模型: python
阻塞式單線程:這是最基本的I/O模型,只有在處理完一個請求以後纔會處理下一個請求。它的缺點是效能差,若是有請求阻塞住,會讓服務沒法繼續接受請求。可是這種模型編寫代碼相對簡單,在應對訪問量不大的狀況時是很是適合的。 react
阻塞式多線程:針對於單線程接受請求量有限的缺點,一個很天然的想法就是給每個請求開一個線程去處理。這樣作的好處是可以接受更多的請求,缺點是在線程產生到必定數量以後,進程之間須要大量進行切換上下文的操做,會佔用CPU大量的時間,不過這樣處理的話編寫代碼的難道稍高於單進程的狀況。 shell
非阻塞式事件驅動:爲了解決多線程的問題,有一種作法是利用一個循環來檢查是否有網絡IO的事件發生,以便決定如何來進行處理(reactor設計模式)。這樣的作的好處是進一步下降了CPU的資源消耗。缺點是這樣作會讓程序難以編寫,由於請求接受後的處理過程由reactor來決定,使得程序的執行流程難以把握。當接受到一個請求後若是涉及到阻塞的操做,這個請求的處理就會停下來去接受另外一個請求,程序執行的流程不會像線性程序那樣直觀。twisted框架就是應用這種IO模型的典型例子。 設計模式
非阻塞式Coroutine:這個模式是爲了解決事件驅動模型執行流程不直觀的問題,它在本質上也是事件驅動的,加入了Coroutine的概念,我要學習的gevent就是應用這種IO模型的函數庫。 網絡
接下來講說Coroutine(協程)這個概念,coroutine能夠理解爲一個輕量級的線程,爲了解決了多線程上下文切換的損耗,提供了一個軟件的協程切換。而且相對於事件驅動,可以將程序的執行過程由編寫程序的人更好的控制。下面的圖展示了協程的執行過程: 多線程
在瞭解了關於gevent的基本概念以後,接下來了就開始安裝gevent。 框架
apt-get install libevent-dev apt-get install python-all-dev pip install gevent
如今基本的概念瞭解後,接下來就能夠開始瞭解相關的代碼了 函數