Golang WebSocket配对逻辑:为何第二个连接触发chat函数?
为什么第二个客户端加入时chat函数会执行
先明确两个关键前提:
partner是无缓冲通道:无缓冲通道的发送和接收操作必须配对完成,一方发送会阻塞直到有另一方接收,反之亦然。- 每个客户端连接后,都会启动独立goroutine执行
match函数。
接下来拆解两个客户端连接的全过程:
第一个客户端连接
进入match函数后,先打印Waiting for a partner...,随后进入select语句:- 尝试执行
case partner <- c:此时没有其他goroutine在接收partner通道的数据,这个发送操作会阻塞,当前goroutine停在这里等待。 case p := <-partner:通道内无数据,该分支不会触发。
- 尝试执行
第二个客户端连接
同样进入match函数,打印等待信息后进入select:- 此时第一个客户端的goroutine正阻塞在
partner <- c的发送操作上,当第二个客户端尝试case p := <-partner时,两个操作会配对完成:第一个客户端的发送操作成功(解除阻塞),第二个客户端则从通道拿到第一个客户端的连接p。 - 配对完成后,第二个客户端的
select会执行chat(p, c),将两个客户端的连接传入chat函数,聊天逻辑正式启动。
- 此时第一个客户端的goroutine正阻塞在
简单来说:无缓冲通道的特性让两个客户端的goroutine在select里完成了"对接",第二个客户端的接收操作直接触发了chat函数的执行,同时也解除了第一个客户端的阻塞状态。
内容的提问来源于stack exchange,提问作者Matt Zhang
相关产品推荐
相关产品推荐

