協程是一種用戶態的輕量級線程。android
server的發展以下:
IO密集型應用: 多進程->多線程->事件驅動->協程
CPU密集型應用:多進程-->多線程nginx
若是說多進程對於多CPU,多線程對應多核CPU,那麼事件驅動和協程則是在充分挖掘不斷提升性能的單核CPU的潛力。編程
異步事件驅動模型中,把會致使阻塞的操做轉化爲一個異步操做,主線程負責發起這個異步操做,並處理這個異步操做的結果。因爲全部阻塞的操做都轉化爲異步操做,理論上主線程的大部分時間都是在處理實際的計算任務,少了多線程的調度時間,因此這種模型的性能一般會比較好。總的說來,當單核cpu性能提高,cpu不在成爲性能瓶頸時,採用異步server可以簡化編程模型,也能提升IO密集型應用的性能。windows
協程擁有本身的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。所以:多線程
協程能保留上一次調用時的狀態(即全部局部狀態的一個特定組合),每次過程重入時,就至關於進入上一次調用的狀態,換種說法:進入上一次離開時所處邏輯流的位置。架構
在併發編程中,協程與線程相似,每一個協程表示一個執行單元,有本身的本地數據,與其它協程共享全局數據和其它資源。目前主流語言基本上都選擇了多線程做爲併發設施,與線程相關的概念是搶佔式多任務(Preemptive multitasking),而與協程相關的是協做式多任務。併發
不論是進程仍是線程,每次阻塞、切換都須要陷入系統調用(system call),先讓CPU跑操做系統的調度程序,而後再由調度程序決定該跑哪個進程(線程)。
並且因爲搶佔式調度執行順序沒法肯定的特色,使用線程時須要很是當心地處理同步問題,而協程徹底不存在這個問題(事件驅動和異步程序也有一樣的優勢)。框架
咱們在本身在進程裏面完成邏輯流調度,碰着i\o我就用非阻塞式的。那麼咱們便可以利用到異步優點,又能夠避免反覆系統調用,還有進程切換形成的開銷,分分鐘給你上幾千個邏輯流不費力。這就是協程。異步
以nginx爲表明的事件驅動的異步server正在橫掃天下,那麼事件驅動模型會是server端模型的終點嗎?
事件驅動編程的架構是預先設計一個事件循環,這個事件循環程序不斷地檢查目前要處理的信息,根據要處理的信息運行一個觸發函數。其中這個外部信息可能來自一個目錄夾中的文件,可能來自鍵盤或鼠標的動做,或者是一個時間事件。這個觸發函數,能夠是系統默認的也能夠是用戶註冊的回調函數。函數
事件驅動程序設計着重於彈性以及異步化上面。許多GUI框架(如windows的MFC,Android的GUI框架),Zookeeper的Watcher等都使用了事件驅動機制。
基於事件驅動的編程是單線程思惟,其特色是異步+回調。
協程也是單線程,可是它能讓原來要使用異步+回調方式寫的非人類代碼,能夠用看似同步的方式寫出來。它是實現推拉互動的所謂非搶佔式協做的關鍵。
協程的好處:
缺點:
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328689835ecd883d910145dfa8227b539725e5ed000
http://www.infoq.com/cn/articles/CplusStyleCorourtine-At-Wechat
https://www.zhihu.com/question/32218874