关闭通道退出多个去例程?
closing channel quits multiple go routines?
鉴于此代码:
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例程的正确方法吗?
从关闭的频道读取总是成功。因此,关闭通道通常用于广播所有从该通道读取的 goroutines 发生的事情(超时、取消请求等)。
回答你的问题:测试,关闭通道是让所有goroutines知道是时候终止的正确方法。这就是 context.Context
取消时的作用。
鉴于此代码:
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例程的正确方法吗?
从关闭的频道读取总是成功。因此,关闭通道通常用于广播所有从该通道读取的 goroutines 发生的事情(超时、取消请求等)。
回答你的问题:测试,关闭通道是让所有goroutines知道是时候终止的正确方法。这就是 context.Context
取消时的作用。