Go并发模型:并发协程chan的优雅退出
go chan的使用
func main(){
//------ 测试go chan 实现生产者和消费者
//通道只由发送方关闭,接收方不可关闭
//发送协程主动关闭通道,接收协程不关闭通道。技巧:把接收方的通道入参声明为只读,如果接收协程关闭只读协程,编译时就会报错。
//协程处理1个通道,并且是读时,协程优先使用for-range,因为range可以关闭通道的关闭自动退出协程。
//,ok可以处理多个读通道关闭,需要关闭当前使用for-select的协程。
//显式关闭通道stopCh可以处理主动通知协程退出的场景。
var c = make(chan string)
//消费者
go func() {
for str := range c {
fmt.Println("消费者01:", str)
}
}()
go func() {
for {
select {
case str, ok := <-c:
if ok {
fmt.Println("消费者02:", str)
}
}
}
}()
var msg = "xj"
go func(msg string, ch chan string) {
msg = "xj01"
ch <- msg
}(msg, c)
go func(msg string, ch chan string) {
msg = "xj02"
ch <- msg
}(msg, c)
time.Sleep(time.Second * 5)
}
网友评论