我试图同时退出多个戈鲁廷。根据 https://www.godesignpatterns.com/2014/04/exiting-multiple-goroutines-simultaneously.html 有一个明确的方法来做到这一点。
我看到的另一种方法是以下
package main
import (
"fmt"
"time"
)
func main() {
var inCh chan int = make(chan int, 100)
var exit chan bool = make(chan bool)
for i := 0; i < 20; i++ {
go func(instance int) {
fmt.Println("In go routine ", instance)
for {
select {
case <-exit:
fmt.Println("Exit received from ", instance)
exit <- true
return
case value := <-inCh:
fmt.Println("Value=", value)
}
}
}(i)
}
time.Sleep(1 * time.Second)
exit <- true
<-exit // Final exit
fmt.Println("Final exit")
}
但是我很困惑,我真的不明白为什么最后的无缓冲通道被执行为最后一个语句。实际上,我有20个go例程在听出口频道。随机一个人将收到它并将其发送给另一个人。为什么总是在go例程中进行接收,并且只有当所有例程都完成时,才会执行带有注释“//Final Exit”的通道接收?
如果有人能给我一个解释,我将不胜感激。
MMTTMM
qq_笑_17
四季花海
相关分类