我正在尝试做的事情: 我正在尝试理解/构建一个包含三个阶段的 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 关注
- 83 浏览
添加回答
举报
0/150
提交
取消