鉴于此代码:
package main
import (
"fmt"
"time"
)
func first(quit chan error) {
fmt.Println("1")
for {
select {
case <-quit:
fmt.Println("first quits")
return
default:
time.Sleep(20 * time.Millisecond)
}
}
}
func second(quit chan error) {
fmt.Println("2")
for {
select {
case <-quit:
fmt.Println("second quits")
return
default:
time.Sleep(20 * time.Millisecond)
}
}
}
func main() {
quit := make(chan error)
go first(quit)
go second(quit)
//something happens here, let's just simulate with a sleep
time.Sleep(500 * time.Millisecond)
close(quit)
time.Sleep(500 * time.Millisecond)
}
似乎正确关闭通道会终止两个独立的 go 例程。我认为通道是 1:1 的通信路径,我首先尝试将一个error写入quit通道,但随后只有一个 go 例程会读取它。所以我一直在阅读各种扇出策略,直到我意识到关闭频道可能会奏效。
以这种方式关闭通道是终止独立 go 例程的正确方法吗?
qq_花开花谢_0
相关分类