В каких случаях происходит блокировка горутины при работе с буферизованным каналом?

Ответ

Блокировка при использовании буферизованного канала (make(chan T, N) где N > 0) происходит в двух предсказуемых ситуациях:


  1. При отправке данных (ch <- data): Горутина блокируется, если буфер канала полностью заполнен. Она будет ждать, пока другая горутина не освободит место в буфере, прочитав из канала.



  2. При чтении данных (<-ch): Горутина блокируется, если буфер канала пуст. Она будет ждать, пока другая горутина не отправит данные в канал.


Это ключевое отличие от небуферизованного канала: отправка в буферизованный канал не блокируется, пока в буфере есть свободное место.

Пример блокировки при отправке:

// Канал с буфером на 2 элемента
ch := make(chan int, 2)

ch <- 1 // Не блокирует, в буфере есть место (1/2)
ch <- 2 // Не блокирует, в буфере есть место (2/2)

// Следующая операция заблокирует текущую горутину,
// так как буфер заполнен. Блокировка снимется, 
// как только кто-то прочитает значение из канала.
ch <- 3