Izy
@Izy
Учу

Вопрос по каналам и блокировке?

Пытаюсь понять как работает гоу . и чего то не доходит
Почему в данном случае программа блокируется.

func main() {
    intCh := make(chan int) 
    intCh <- 10      // функция main блокируется
    fmt.Println(<-intCh)
}


А если канал имеет буфер то все работает до конца
func main() {
    intCh := make(chan int,100) 
    intCh <- 10      // функция main неблокируется
    fmt.Println(<-intCh)
}


Но я чего то логику не уловил. Ведь канал должен блокироваться ибо кто то должен получить данные из гроутин (в данном случае основная main). Так как мы все запускаем в main то канал блокируется . Но почему он не блокируется во втором случае. То есть код доходит гроутины с буфером ложит туда данные и все, так как он с буфером он некогда не блокируется. Типо такая логика и все ?
  • Вопрос задан
  • 282 просмотра
Решения вопроса 2
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Канал в Go это очередь декларированной емкости(реализованная кольцевым буфером). Если из очереди не забирать она забивается и блокирует.
Ответ написан
Комментировать
@quiex
Изучите как работают каналы в go.

В первом случае горутина заблокируется, т.к. никто не читает из небуферизированного канала.
Во втором случае используется буферизированный канал, следовательно горутина заблокируется только тогда, когда (в вашем случае) вы попробуете записать в него 101-й элемент(читай: канал заполнится).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы