select 调度疑惑

来源:11-4 用select进行调度

慕妹2184772

2020-06-18

老师好,我在学习select调度时有点疑惑:

messages := make(chan string)
	signals := make(chan bool)

	select {
	case msg := <-messages:
		fmt.Println("received message", msg)
	default:
		fmt.Println("no message received")
	}

	msg := "hi"
	select {
	case messages <- msg:
		fmt.Println("sent message", msg)
	default:
		fmt.Println("no message sent")
	}

	select {e
	case msg := <-messages:
		fmt.Println("received message", msg)
	case sig := <-signals:
		fmt.Println("received signal", sig)
	default:
		fmt.Println("no activity")
	}

你看第二段 给 msg 赋值 “hi” 以后,按理已经有值了,为啥没能捕获到(没有输出 sent message hi)

写回答

1回答

ccmouse

2020-06-18

选择一个分支的条件不是msg有值。而是有人同时在收发。这里是向messages发送msg,那么必须有人收,才有可能被选中。反之,如果是下面的接收值case msg := <-messages,则必须有人发,才会被选中。

这里的select需要放在各自的goroutine中,才能完成收发动作。


0
1
慕妹2184772
谢谢老师
2020-06-18
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程