Golang 執行緒 和 協程 的區別

2021-10-02 09:53:58 字數 2071 閱讀 3732

目錄

前言

19年也快結束了。現在的總結更多是放在了草稿 而沒有發出,這次詳細分享下在 go 中,執行緒和協程的區別及其關係。

協程

協程,英文名coroutine。但在 go 語言中,協程的英文名是:gorutine。它常常被用於進行多工,即併發作業。沒錯,就是多執行緒作業的那個作業。

雖然在 go 中,我們不用直接編寫執行緒之類的**來進行併發,但是 go 的協程卻依賴於執行緒來進行。

下面我們來看看它們的區別。

執行緒的基礎介紹,這裡請自行網上搜尋文章,因為關於執行緒的優秀介紹文章已經很多。

協程的特點

這裡先直接列出執行緒的特點,然後從例子中進行解析。

多個協程可由乙個或多個執行緒管理,協程的排程發生在其所在的執行緒中。

可以被排程,排程策略由應用層**定義,即可被高度自定義實現。

執行效率高。

占用記憶體少。

上面第 1 和 第 2點

我們來看乙個例子:

func testgorutine

(t *testing.t)

// 控制等待所有協程都執行完再退出程式

wg.add(2)

// 執行乙個協程

go func()

()// 執行第二個協程

go func()

()wg.

wait()

}

上面的**片段跑了兩個協程,執行後,觀察輸出的順序是交錯的。可能是:

65661

2367

意味著在執行協程a的過程中,可以隨時中斷,去執協程行b,協程b也可能在執行過程中中斷再去執行協程a。

看起來協程a 和 協程b 的執行像是執行緒的切換,但是請注意,這裡的 a 和 b 都執行在同乙個執行緒裡面。它們的排程不是執行緒的切換,而是純應用態的協程排程。

關於上述**中,為什麼要指定下面兩行**?

runtime.

gomaxprocs(1

)time.

sleep

(time.second)

這需要您去看下 go 的協程排程入門基礎,請看我之前的另外一篇排程分析文章:

go 的協程排程機制

如果不設定 runtime.gomaxprocs(1),那麼程式將會根據作業系統的 cpu 核數而啟動對應數量的 p,導致多個 m,即執行緒的啟動。那麼我們程式中的協程,就會被分配到不同的執行緒裡面去了。為了演示,故設定數量 1,使得它們都被分配到了同乙個執行緒裡面,存於執行緒的協程佇列裡面,等待被執行或排程。

協程特點中的第 3 和 第 4 點。

3. 執行效率高。

4. 占用記憶體少。

因為協程的排程切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。排程發生在應用態而非核心態。

記憶體的花銷,使用其所在的執行緒的記憶體,意味著執行緒的記憶體可以供多個協程使用。

其次協程的排程不需要多執行緒的鎖機制,因為只有乙個執行緒,也不存在同時寫變數衝突,所以執行效率比多執行緒高很多。

和執行緒的整體對比

比較的點

執行緒協程

資料儲存

核心態的記憶體空間

一般是執行緒提供的使用者態記憶體空間

切換操作

操作最終在核心層完成,應用層需要呼叫核心層提供的 syscall 底層函式

應用層使用**進行簡單的現場儲存和恢復即可

任務排程

由核心實現,搶占方式,依賴各種鎖

由使用者態的實現的具體排程器進行。例如 go 協程的排程器

語音支援程度

絕大部分程式語言

部分語言:lua,go,python …

實現規範

按照現代作業系統規範實現

無統一規範。在應用層由開發者實現,高度自定義,比如只支援單執行緒的執行緒。不同的排程策略,等等

Golang 執行緒 和 協程 的區別

部落格 github 掘金 和執行緒的整體對比 國慶愉快各位,距離上次發文快兩個月了,19年也快結束了。現在的總結更多是放在了草稿而沒有發出,這次詳細分享下在 go 中,執行緒和協程的區別及其關係。協程,英文名coroutine。但在 go 語言中,協程的英文名是 gorutine。它常常被用於進行...

執行緒和協程的區別

協程,又稱為微執行緒,纖程 coroutine 通俗的理解 在乙個執行緒中的某個函式,可以在任何地方儲存當前函式的一些臨時變數等資訊,然後切換到另外乙個函式中執行,注意不是通過呼叫函式的方式做到的,並且切換的次數以及什麼時候再切換到原來的函式都由開發者自己確定。核心 單執行緒中,由開發者來進行排程的...

程序 執行緒和協程的區別

這是我的第一篇部落格,文章如有不足之處,請各位大神多多指教!執行緒和程序的操作是由程式觸發系統介面,最後的執行者是系統 協程的操作則是程式設計師。切換開銷 即排程和切換的時間 程序 執行緒 協程 程序和執行緒的區別 概要 計算密集型 cpu bound 適合多程序,而多執行緒是雞肋 和i o密集型 ...