1 回答
TA贡献1847条经验 获得超11个赞
readHandler连接失败时跳出循环:
_, p, err := conn.ReadMessage()
if err != nil {
wg.Done()
fmt.Println(err)
return // <--- add this line
}
如果没有返回,函数会在一个紧密的循环中旋转,读取错误,直到出现恐慌。
在 goroutine 的开头使用defer wg.Done()以确保 Done 只被调用一次。
func readHandler(ctx context.Context, conn *websocket.Conn, wg *sync.WaitGroup, server string) {
defer wg.Done()
for {
select {
case <-ctx.Done():
return
default:
_, p, err := conn.ReadMessage()
if err != nil {
fmt.Println(err)
return
}
...
也更新control功能。
因为调用者不会与 并发执行任何代码,所以运行goroutinereadHander没有任何价值。readHandler删除所有对等待组的引用readHandler并直接调用该函数:更改go readHandler(ctx, conn, &localwg, server)为readHandler(ctx, conn, server).
还有更多问题,但这应该会让你走得更远。
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报