需要很少的帮助来理解代码的流程?我不明白输出中的例程结束是如何出现在其他输出语句之间的
Need little help to understand the flow of the code ? i don't understand how routine-end in the output comes in between the other output statements
试图理解 goroutines 的流程所以我只写了这段代码我无法理解的一件事是 routine-end 如何在其他 go routines 之间运行并完成单个 go routines 并打印输出最后的频道。
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
本身 运行 在单独的 "main" goroutine 中。
由于 goroutines 并发执行,它们的 运行 的顺序通常是不可预测的,并且取决于时间、机器的繁忙程度等。 运行s 之间和机器之间的结果可能不同。在不同的地方插入 time.Sleep
呼叫可能有助于形象化。例如,在 "came to blocking statement" 之前插入 time.Sleep
100 毫秒表明所有 add
goroutines 启动。
您可能会在 运行 中看到的通常是一个 add
goroutine 启动,将其切片添加到其 sum
并将 sum
写入 dataChannel
.由于 main
启动了一些 goroutines 并立即从通道读取,这个读取得到 add
写入的 sum
然后程序存在 - 因为 默认情况下 main won等待所有 goroutines 完成.
此外,由于 dataChannel
通道是无缓冲的并且 main
只读取一个值,其他 add
goroutines 将在写入时无限期地阻塞在通道上。
我确实建议查看一些有关 goroutines 和通道的介绍性资源。他们从简单的原则中建立概念。一些适合您的链接:
- Golang tour
- https://gobyexample.com/ -- 从 Goroutines 示例开始,然后执行接下来的几个。
试图理解 goroutines 的流程所以我只写了这段代码我无法理解的一件事是 routine-end 如何在其他 go routines 之间运行并完成单个 go routines 并打印输出最后的频道。
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
本身 运行 在单独的 "main" goroutine 中。
由于 goroutines 并发执行,它们的 运行 的顺序通常是不可预测的,并且取决于时间、机器的繁忙程度等。 运行s 之间和机器之间的结果可能不同。在不同的地方插入 time.Sleep
呼叫可能有助于形象化。例如,在 "came to blocking statement" 之前插入 time.Sleep
100 毫秒表明所有 add
goroutines 启动。
您可能会在 运行 中看到的通常是一个 add
goroutine 启动,将其切片添加到其 sum
并将 sum
写入 dataChannel
.由于 main
启动了一些 goroutines 并立即从通道读取,这个读取得到 add
写入的 sum
然后程序存在 - 因为 默认情况下 main won等待所有 goroutines 完成.
此外,由于 dataChannel
通道是无缓冲的并且 main
只读取一个值,其他 add
goroutines 将在写入时无限期地阻塞在通道上。
我确实建议查看一些有关 goroutines 和通道的介绍性资源。他们从简单的原则中建立概念。一些适合您的链接:
- Golang tour
- https://gobyexample.com/ -- 从 Goroutines 示例开始,然后执行接下来的几个。