協程與執行緒

2022-09-17 18:36:12 字數 670 閱讀 9539

reference:

協程不只在go語言中實現了,其實目前大部分語言都實現了自己的一套協程,包括c#、erlang、python、lua、j**ascript、ruby等。

相對於協程,你可能對程序和執行緒更為熟悉。

程序一般代表乙個應用服務,在乙個應用服務中可以建立多個執行緒,

而協程與程序、執行緒的概念不一樣,可以將協程看作是乙個類函式或者一塊函式中的**,可以在乙個主線程裡面輕鬆建立多個協程。

程式呼叫協程與呼叫函式不一樣的是,協程可以通過暫停或者阻塞的方式將協程的執行掛起,而其它協程可以繼續執行。這裡的掛起只是在程式中(使用者態)的掛起,同時將**執行權轉讓給其它協程使用,待獲取執行權的協程執行完成之後,將從掛起點喚醒掛起的協程。 協程的掛起和喚醒是通過乙個排程器來完成的。

相比執行緒,協程少了由於同步資源競爭帶來的cpu上下文切換,i/o密集型的應用比較適合使用,特別是在網路請求中,有較多的時間在等待後端響應,協程可以保證執行緒不會阻塞在等待網路響應中,充分利用了多核多執行緒的能力。而對於cpu密集型的應用,由於在多數情況下cpu都比較繁忙,協程的優勢就不是特別明顯了。

協程又是一種輕量級資源,即使建立了上千個協程,對於系統來說也不是很大的負擔,但如果在程式中建立上千個執行緒,那系統可真就壓力山大了。可以說,協程的設計方式極大地提高了執行緒的使用率。

程序 執行緒與協程

程序的出現是為了更好的利用cpu資源使到併發成為可能。假設有兩個任務a和b,當a遇到io操作,cpu默默的等待任務a讀取完操作再去執行任務b,這樣無疑是對cpu資源的極大的浪費。聰明的老大們就在想若在任務a讀取資料時,讓任務b執行,當任務a讀取完資料後,再切換到任務a執行。注意關鍵字切換,自然是切換...

執行緒與協程差別

執行緒這種東西我們自已建立start後,就自己去跑了,剩下的事情就不需要我們去管了,各個執行緒之間的排程問題交給系統去做,系統不可能智慧型的給執行緒分配時間,系統很傻很公平,一般的是每個執行緒給你10ms的時間片去跑,跑不完掛起,再去跑其他的執行緒。重點 執行緒之間的排程是系統在做。協程是一種使用者...

協程與程序,執行緒

我們通常所說的協程coroutine其實是corporateroutine的縮寫,直接翻譯為協同的例程,一般我們都簡稱為協程。在linux系統中,執行緒就是輕量級的程序,而我們通常也把協程稱為輕量級的執行緒即微執行緒。程序是核心排程,而協程是在使用者態排程,也就是說程序的上下文是在核心態儲存恢復的,...