我正在嘗試做的事情:?我正在嘗試理解/構(gòu)建一個包含三個階段的 go 管道。Stage 1 寫入通道 A。 Stage 2 有多個 go 例程。每個 go 例程從通道 A 讀取,執(zhí)行一些操作并將結(jié)果寫入通道 Bn(通道 B1,B2..Bn)。第 3 階段創(chuàng)建了 n(=第 2 階段的通道總數(shù))個 go 例程,每個 go 例程從第 2 階段的一個通道讀取。問題:?管道按預(yù)期正常工作,操作分布在 go 例程中。但是當我進行逃逸分析時,發(fā)現(xiàn)從一個階段發(fā)送到另一個階段的通道參數(shù)被報告為“泄漏參數(shù)”。代碼片段:?為簡單起見,我發(fā)布了顯示階段 1 通道創(chuàng)建的代碼,以及打印從階段通道 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}為什么逃逸分析報告泄漏參數(shù)和completionFlag標志?
1 回答

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