9 2 Go語言goroutine(輕量級執行緒)

2021-10-08 08:52:08 字數 2692 閱讀 3939

雖然,執行緒池為邏輯編寫者提供了執行緒分配的抽象機制。但是,如果面對隨時隨地可能發生的併發和執行緒處理需求,執行緒池就不是非常直觀和方便了。能否有一種機制:使用者分配足夠多的任務,系統能自動幫助使用者把任務分配到 cpu 上,讓這些任務盡量併發運作。這種機制在 go語言中被稱為 goroutine。

goroutine 是 go語言中的輕量級執行緒實現,由 go 執行時(runtime)管理。go 程式會智慧型地將 goroutine 中的任務合理地分配給每個 cpu。

go 程式從 main 包的 main() 函式開始,在程式啟動時,go 程式就會為 main() 函式建立乙個預設的 goroutine。

使用普通函式建立 goroutine

go 程式中使用 go 關鍵字為乙個函式建立乙個 goroutine。乙個函式可以被建立多個 goroutine,乙個 goroutine 必定對應乙個函式。

1) 格式

為乙個普通函式建立 goroutine 的寫法如下:

go 函式名( 引數列表 )

使用 go 關鍵字建立 goroutine 時,被呼叫函式的返回值會被忽略。

如果需要在 goroutine 中返回資料,請使用後面介紹的通道(channel)特性,通過通道把資料從 goroutine 中作為返回值傳出。

2) 例子

package main

import

("fmt"

"time"

)func

running()

}func

main()

命令列輸出如下:

tick 1

tick 2

tick 3

tick 4

tick 5

**執行後,命令行會不斷地輸出 tick,同時可以使用 fmt.scanln() 接受使用者輸入。兩個環節可以同時進行。

**說明如下:

第 12 行,使用 for 形成乙個無限迴圈。

第 13 行,times 變數在迴圈中不斷自增。

第 14 行,輸出 times 變數的值。

第 17 行,使用 time.sleep 暫停 1 秒後繼續迴圈。

第 25 行,使用 go 關鍵字讓 running() 函式併發執行。

第 29 行,接受使用者輸入,直到按 enter 鍵時將輸入的內容寫入 input 變數中並返回,整個程式終止。

這段**的執行順序如下圖所示。

圖:併發執行圖

這個例子中,go 程式在啟動時,執行時(runtime)會預設為 main() 函式建立乙個 goroutine。在 main() 函式的 goroutine 中執行到 go running 語句時,歸屬於 running() 函式的 goroutine 被建立,running() 函式開始在自己的 goroutine 中執行。此時,main() 繼續執行,兩個 goroutine 通過 go 程式的排程機制同時運作。

使用匿名函式建立goroutine

go 關鍵字後也可以為匿名函式或閉包啟動 goroutine。

1) 使用匿名函式建立goroutine的格式

使用匿名函式或閉包建立 goroutine 時,除了將函式定義部分寫在 go 的後面之外,還需要加上匿名函式的呼叫引數,格式如下:

go

func

( 引數列表 )

( 呼叫引數列表 )

其中:

2) 使用匿名函式建立goroutine的例子

在 main() 函式中建立乙個匿名函式並為匿名函式啟動 goroutine。匿名函式沒有引數。**將並行執行定時列印計數的效果。參見下面的**:

package main

import

("fmt"

"time"

)func

main()

}()var input string

fmt.

scanln

(&input)

}

**說明如下:

第 10 行,go 後面接匿名函式啟動 goroutine。

第 12~19 行的邏輯與前面程式的 running() 函式一致。

第 21 行的括號的功能是呼叫匿名函式的引數列表。由於第 10 行的匿名函式沒有引數,因此第 21 行的引數列表也是空的。

提示

所有 goroutine 在 main() 函式結束時會一同結束。

goroutine 雖然類似於執行緒概念,但是從排程效能上沒有執行緒細緻,而細緻程度取決於 go 程式的 goroutine 排程器的實現和執行環境。

終止 goroutine 的最好方法就是自然返回 goroutine 對應的函式。雖然可以用 golang.org/x/net/context 包進行 goroutine 生命期深度控制,但這種方法仍然處於內部試驗階段,並不是官方推薦的特性。

截止 go 1.9 版本,暫時沒有標準介面獲取 goroutine 的 id。

Go語言學習 goroutine

簡介 goroutine是go語言中最為nb的設計,也是其魅力所在,goroutine的本質是協程,是實現平行計算的核心。goroutine使用方式非常的簡單,只需使用go關鍵字即可啟動乙個協程,並且它是處於非同步方式執行,你不需要等它執行完成以後在執行以後的 go func 通過go關鍵字啟動乙個...

Go語言 併發程式設計goroutine

在go語言中併發是通過goroutine實現。goroutine類似於執行緒,屬於使用者態執行緒。go語言也可以通過channel 管道 與多個goroutine進行通訊。goroutine類似於執行緒,在go語言中底層分配了乙個執行緒池,因此不需要我們對其進行管理,由go執行時的routine進行...

Go語言中Goroutine的設定

一 通過runtime包進行多核設定 1.numcpu 獲取當前系統的cpu核數 2.gomaxprocs設定當前程式執行時占用的cpu核數 版本1.6之前預設是使用1個核,而之後是全部使用。好玩的程式 func dosomething func main err return 設定核數 runti...