Gevent官網文檔地址:http://www.gevent.org/contents.html
基本概念
我們通常所說的協程Coroutine其實是corporateroutine的縮寫,直接翻譯為協同的例程,一般我們都簡稱為協程。
在linux系統中,線程就是輕量級的進程,而我們通常也把協程稱為輕量級的線程即微線程。
進程和協程
下面對比一下進程和協程的相同點和不同點:
相同點:
我們都可以把他們看做是一種執行流,執行流可以掛起,并且后面可以在你掛起的地方恢復執行,這實際上都可以看做是continuation,關于這個我們可以通過在linux上運行一個hello程序來理解:

shell進程和hello進程:
開始,shell進程在運行,等待命令行的輸入
執行hello程序,shell通過系統調用來執行我們的請求,這個時候系統調用會講控制權傳遞給操作系統。操作系統保存shell進程的上下文,創建一個hello進程以及其上下文并將控制權給新的hello進程。
hello進程終止后,操作系統恢復shell進程的上下文,并將控制權傳回給shell進程
shell進程繼續等待下個命令的輸入
當我們掛起一個執行流的時,我們要保存的東西:
棧,其實在你切換前你的局部變量,以及要函數的調用都需要保存,否則都無法恢復
寄存器狀態,這個其實用于當你的執行流恢復后要做什么
而寄存器和棧的結合就可以理解為上下文,上下文切換的理解:
CPU看上去像是在并發的執行多個進程,這是通過處理器在進程之間切換來實現的,操作系統實現這種交錯執行的機制稱為上下文切換
操作系統保持跟蹤進程運行所需的所有狀態信息。這種狀態,就是上下文。
在任何一個時刻,操作系統都只能執行一個進程代碼,當操作系統決定把控制權從當前進程轉移到某個新進程時,就會進行上下文切換,即保存當前進程的上下文,恢復新進程的上下文,然后將控制權傳遞到新進程,新進程就會從它上次停止的地方開始。
不同點:
執行流的調度者不同,進程是內核調度,而協程是在用戶態調度,也就是說進程的上下文是在內核態保存恢復的,而協程是在用戶態保存恢復的,很顯然用戶態的代價更低
進程會被強占,而協程不會,也就是說協程如果不主動讓出CPU,那么其他的協程,就沒有執行的機會。
對內存的占用不同,實際上協程可以只需要4K的棧就足夠了,而進程占用的內存要大的多
從操作系統的角度講,多協程的程序是單進程,單協程
線程和協程
既然我們上面也說了,協程也被稱為微線程,下面對比一下協程和線程:
新聞熱點
疑難解答