为了账号安全,请及时绑定邮箱和手机立即绑定

逃逸分析显示通道为泄漏参数

逃逸分析显示通道为泄漏参数

Go
人到中年有点甜 2023-06-05 18:01:45
我正在尝试做的事情: 我正在尝试理解/构建一个包含三个阶段的 go 管道。Stage 1 写入通道 A。 Stage 2 有多个 go 例程。每个 go 例程从通道 A 读取,执行一些操作并将结果写入通道 Bn(通道 B1,B2..Bn)。第 3 阶段创建了 n(=第 2 阶段的通道总数)个 go 例程,每个 go 例程从第 2 阶段的一个通道读取。问题: 管道按预期正常工作,操作分布在 go 例程中。但是当我进行逃逸分析时,发现从一个阶段发送到另一个阶段的通道参数被报告为&ldquo;泄漏参数&rdquo;。代码片段: 为简单起见,我发布了显示阶段 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 堆上放置您不期望的东西时的性能问题很有用。)


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信