我正在尝试做的事情: 我正在尝试理解/构建一个包含三个阶段的 go 管道。Stage 1 写入通道 A。 Stage 2 有多个 go 例程。每个 go 例程从通道 A 读取,执行一些操作并将结果写入通道 Bn(通道 B1,B2..Bn)。第 3 阶段创建了 n(=第 2 阶段的通道总数)个 go 例程,每个 go 例程从第 2 阶段的一个通道读取。
问题: 管道按预期正常工作,操作分布在 go 例程中。但是当我进行逃逸分析时,发现从一个阶段发送到另一个阶段的通道参数被报告为“泄漏参数”。
代码片段: 为简单起见,我发布了显示阶段 1 通道创建的代码,以及打印从阶段通道 1 读取的值的阶段 2。
package main
import "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 exits
func main() {
numOfJobs := 10
stageOneChannel := createStageOne(numOfJobs)
done := make(chan struct{})
createStageTwo(stageOneChannel, done)
<-done
}
为什么逃逸分析报告泄漏参数和completionFlag标志?
倚天杖
相关分类