GOROUTINE · CHANNEL Trung cấp CA 02 / 08

Một tab chậm kéo sập cả phòng

Bảng tỉ số bóng đá trực tiếp đẩy điểm số tới nhiều tab trình duyệt cùng lúc, mỗi tab là một channel. Hai cách viết hàm phát:

// Version A
func (h *Hub) publish(s Score) {
    for ch := range h.subs {
        ch <- s          // gửi và CHỜ tới khi bên kia nhận được
    }
}

// Version B
func (h *Hub) publish(s Score) {
    for ch := range h.subs {
        select {
        case ch <- s:    // gửi được thì gửi
        default:         // channel đầy → bỏ qua nhịp này
        }
    }
}

Một khán giả để tab chạy nền, mạng chậm, channel của họ đầy ứ. Với Version A, điều gì xảy ra với những khán giả CÒN LẠI?