日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Goroutine 開啟和退出到底做了什么?

 

Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.

??本文基于 Go 1.14。

在 Go 中,協程就是一個包含程序運行時的信息的結構體,如棧,程序計數器,或者它當前的 OS 線程。調度器還必須注意 Goroutine 的開始和退出,這兩個階段需要謹慎管理。

如果你想了解更多關于棧和程序計數器的信息,我推薦你閱讀我的文章 Go:協程切換時涉及到哪些資源?[1]。

開啟

開啟一個協程的處理過程相當簡單。我們用一個程序作為例子:

Goroutine 開啟和退出到底做了什么?

 

main 函數在打印信息之前開啟了一個協程。由于協程會有自己的運行時間,因此 Go 通知運行時配置一個新協程,意味著:

  • 創建棧
  • 收集當前程序計數器或調用方數據的信息
  • 更新協程內部數據,如 ID 或 狀態

然而,協程沒有立即獲取運行時狀態。新創建的協程被加入到了本地隊列的最前端,會在 Go 調度的下一周期運行。下面是現在這種狀態的示意圖:

Goroutine 開啟和退出到底做了什么?

 

把協程放在隊列的前端,這樣它就會在當前協程運行之后第一個運行。如果有工作竊取發生,它不是在當前線程就是在另一個線程運行。

我推薦你閱讀我的文章 Go: Go 調度器中的工作竊取[2]來獲取更多信息。

在匯編指令中也可以看到協程的創建過程:

Goroutine 開啟和退出到底做了什么?

 

協程被創建并被加入到本地協程隊列后,它直接執行主函數的下一個指令。

退出

協程結束時,為了不浪費 CPU 資源,Go 必須調度另一個協程。這也使協程可以在以后復用。

在我的文章 Go: 協程怎么復用?[3]中你可以找到更多信息。

然而,Go 需要一個能識別到協程結束的方法。這個方法是在協程創建時控制的。創建協程時,Go 在將程序計數器設置為協程真實調用的函數之前,將堆棧設置為名為 goexit 的函數。這個技巧可以使協程在結束時必須調 goexit 函數。下面的程序可以使我們理解得更形象:

Goroutine 開啟和退出到底做了什么?

 

根據輸出信息進行堆棧追蹤:

/path/to/src/main.go:16
/usr/local/go/src/runtime/asm_amd64.s:1373

用匯編寫的 asm_amd64 文件包含這個函數:

Goroutine 開啟和退出到底做了什么?

 

之后,Go 切換到 g0 調度另一個協程。

我們也可以調用 runtime.Goexit() 來手動終止協程:

Goroutine 開啟和退出到底做了什么?

 

這個函數首先運行 defer 中的函數,然后會運行前面在協程退出時我們看到的那個函數。


via: https://medium.com/a-journey-with-go/go-how-does-a-goroutine-start-and-exit-2b3303890452

作者:Vincent Blanchon[4]譯者:lxbwolf[5]校對:polaris1119[6]

本文由 GCTT[7] 原創編譯,Go 中文網[8] 榮譽推出

參考資料

[1]

Go:協程切換時涉及到哪些資源?: https://medium.com/a-journey-with-go/go-what-does-a-goroutine-switch-actually-involve-394c202dddb7

[2]

Go: Go 調度器中的工作竊取: https://medium.com/a-journey-with-go/go-work-stealing-in-go-scheduler-d439231be64d

[3]

Go: 協程怎么復用?: https://medium.com/a-journey-with-go/go-how-does-go-recycle-goroutines-f047a79ab352

[4]

Vincent Blanchon: https://medium.com/@blanchon.vincent

[5]

lxbwolf: https://github.com/lxbwolf

[6]

polaris1119: https://github.com/polaris1119

[7]

GCTT: https://github.com/studygolang/GCTT

[8]

Go 中文網: https://studygolang.com/

分享到:
標簽:Goroutine
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定