協程優缺點

協程優缺點

協程模型

現有的協程調度模型大多是N:M,意思就是每個線程下可以運行多個協程,而且線程也可以有多個。爲了調度,又可以有有棧協程和無棧協程。在Linux下通常是利用ucontext_t實現,Boost也有一個context庫可以作爲實現基礎(據說Boost的實現更快,本人未證實)。雖然一個線程下可以運行多個協程,但是同一線程下不能有協程併發。

協程出現的原因

協程主要是爲了提高併發,而且主要是IO併發。協程並不適合並行計算或者並行處理任務,因爲同一時刻運行的協程數不可能大於操作系統線程,而且需要協程切換,不如線程池。對於IO密集任務,利用回調函數,配合協程,可以使邏輯更加簡單清晰,不過協程可以做的,線程一樣可以做,比如Reactor模型。

舉一個網絡通信的例子:

加入10個客戶端接入,服務器線程數4。

如果用協程,那麼可以直接開啓10個協程,接受所有鏈接,把任務放到協程處理,不過運行時,還是要等到協程依次執行完畢,可以有四個協程同時執行,或者協程內部調度等等,好處是可以直接就接受全部鏈接;如果用線程,那麼一次最多接受4個鏈接,但是四個鏈接可以同時處理(假設不使用select,poll或epoll)。

協程優勢

  1. 可以一次接受多個連接,一直accept等待鏈接,有鏈接到來就開啓一個協程完成任務
  2. 編寫異步程序邏輯更清晰

注意

協程並不是一定就好,協程能完成的線程一樣能完成,協程有它特定的使用場景以及優勢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章