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 關注
- 119 瀏覽
添加回答
舉報