gpt4 book ai didi

go - 需要一点帮助来理解代码流程?我不明白输出中的routine-end 是如何出现在其他输出语句之间的

转载 作者:行者123 更新时间:2023-12-01 22:14:58 26 4
gpt4 key购买 nike

试图理解 goroutine 的流程,所以我写了这段代码,只有一件我无法理解的事情是,routine-end 如何在其他 go 例程之间运行并完成单个 go 例程并在最后打印来自 channel 的输出.


import(
"fmt"
)


func add(dataArr []int,dataChannel chan int,i int ){
var sum int
fmt.Println("GOROUTINE",i+1)
for i:=0;i<len(dataArr);i++{
sum += dataArr[i]
}
fmt.Println("wRITING TO CHANNEL.....")
dataChannel <- sum

fmt.Println("routine-end")
}


func main(){
fmt.Println("main() started")
dataChannel := make(chan int)
dataArr := []int{1,2,3,4,5,6,7,8,9}
for i:=0;i<len(dataArr);i+=3{

go add(dataArr[i:i+3],dataChannel,i)
}
fmt.Println("came to blocking statement ..........")
fmt.Println(<-dataChannel)

fmt.Println("main() end")

}
output

main() started
came to blocking statement ..........
GOROUTINE 1
wRITING TO CHANNEL.....
routine-end
GOROUTINE 4
wRITING TO CHANNEL.....
6
main() end

最佳答案

您的 for循环启动 3 个调用 add 的 goroutine。功能。

此外,main本身在一个单独的“主”goroutine 中运行。

由于 goroutines 并发执行,它们的运行顺序通常是不可预测的,并且取决于时间、机器的繁忙程度等。运行之间和机器之间的结果可能会有所不同。插入 time.Sleep不同地方的电话可能有助于将其可视化。例如,插入 time.Sleep “来到阻塞语句”之前的 100 毫秒显示所有 add goroutines 启动。

您在运行中通常会看到一个 add goroutine 启动,将其 slice 添加到它的 sum并写sumdataChannel .由于main启动一些 goroutine 并立即从 channel 读取,此读取得到 sum作者 add然后程序存在——因为默认情况下 main 不会等待所有 goroutine 完成 .

此外,由于 dataChannel channel 无缓冲,main只读取一个值,另一个 add goroutines 将在写入时无限期地阻塞 channel 。

我确实建议阅读一些关于 goroutine 和 channel 的介绍性资源。他们从简单的原则建立概念。一些很好的链接给你:

  • Golang tour
  • https://gobyexample.com/ -- 从 Goroutines 示例开始,然后做接下来的几个。
  • 关于go - 需要一点帮助来理解代码流程?我不明白输出中的routine-end 是如何出现在其他输出语句之间的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60965457/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com