我正在嘗試做的事情:?我正在嘗試理解/構建一個包含三個階段的 go 管道。Stage 1 寫入通道 A。 Stage 2 有多個 go 例程。每個 go 例程從通道 A 讀取,執行一些操作并將結果寫入通道 Bn(通道 B1,B2..Bn)。第 3 階段創建了 n(=第 2 階段的通道總數)個 go 例程,每個 go 例程從第 2 階段的一個通道讀取。問題:?管道按預期正常工作,操作分布在 go 例程中。但是當我進行逃逸分析時,發現從一個階段發送到另一個階段的通道參數被報告為“泄漏參數”。代碼片段:?為簡單起見,我發布了顯示階段 1 通道創建的代碼,以及打印從階段通道 1 讀取的值的階段 2。package mainimport "fmt"func createStageOne(numOfJobs int) <-chan int {? ?stageOneChannel := make(chan int)? ?go func(nJobs int) {? ? ? for i := 0; i < nJobs; i++ {? ? ? ? stageOneChannel <- i? ? ? }? ? ? close(stageOneChannel)? ?}(numOfJobs)? ?return stageOneChannel} // stageOneChannel closes and go routine exits once nJobs are completed?func createStageTwo(in <-chan int, completionFlag chan struct{}) {? ? go func() {? ? ? ? for n := range in {? ? ? ? ? ? fmt.Println("Received from stage 1 channel ", n)? ? ? ? }? ? ? ? completionFlag <- struct{}{}? ? }()}// Comes out of for loop when stage 1 channel closes and go routine also exitsfunc main() {? ? numOfJobs := 10? ? stageOneChannel := createStageOne(numOfJobs)? ? done := make(chan struct{})? ? createStageTwo(stageOneChannel, done)? ? <-done}為什么逃逸分析報告泄漏參數和completionFlag標志?
1 回答

倚天杖
TA貢獻1828條經驗 獲得超3個贊
有問題的參數是引用類型的通道。它們在 createStageTwo() 中創建的閉包中被捕獲,并且可以在 createStageTwo() 返回時繼續在該閉包的 go 例程中使用。因此,它們被標記為泄漏參數。如果不是,那么它們將被放置在堆棧中,并在 main() 完成它們時變得無效。
這并不意味著您有問題。逃逸分析不是用來檢測資源泄漏的,大多數人永遠不需要使用它。(它對于在 GC 堆上放置您不期望的東西時的性能問題很有用。)
- 1 回答
- 0 關注
- 115 瀏覽
添加回答
舉報
0/150
提交
取消