这是一个在 goroutine 中使用通道和选择的练习。如果断开连接通道更改为缓冲通道,则 goroutine 根本不会运行。
为什么从无缓冲通道更改为缓冲通道会阻止运行 goroutine?
func SelectDemo(wg *sync.WaitGroup) {
messageCh := make(chan int, 10)
disconnectCh := make(chan struct{})
// go routine won't run if channel is buffered
//disconnectCh := make(chan struct{}, 1)
defer close(messageCh)
defer close(disconnectCh)
go func() {
fmt.Println(" goroutine")
wg.Add(1)
for {
select {
case v := <-messageCh:
fmt.Println(v)
case <-disconnectCh:
fmt.Println(" disconnectCh")
// empty the buffered channel before exiting
for {
select {
case v := <-messageCh:
fmt.Println(v)
default:
fmt.Println(" disconnection, return")
wg.Done()
return
}
}
}
}
}()
fmt.Println("Sending ints")
for i := 0; i < 10; i++ {
messageCh <- i
}
fmt.Println("Sending done")
disconnectCh <- struct{}{}
}
这是从 main 调用函数的代码。我使用等待组来确保 goroutine 在程序退出之前完成:
wg := sync.WaitGroup{}
ch09.SelectDemo(&wg)
wg.Wait()
一只萌萌小番薯
犯罪嫌疑人X
相关分类