Почему отправка значения больше размера буферизованного канала в Golang вызывает ошибку взаимоблокировки? - PullRequest
0 голосов
/ 30 апреля 2020
// By default channels are _unbuffered_, meaning that they
// will only accept sends (`chan <-`) if there is a
// corresponding receive (`<- chan`) ready to receive the
// sent value. _Buffered channels_ accept a limited
// number of  values without a corresponding receiver for
// those values.

package main

import "fmt"

func main() {

    // Here we `make` a channel of strings buffering up to
    // 2 values.
    messages := make(chan string, 2)

    // Because this channel is buffered, we can send these
    // values into the channel without a corresponding
    // concurrent receive.
    messages <- "buffered"
    messages <- "channel"
    messages <- "channel1" //I added this. 

    // Later we can receive these two values as usual.
    fmt.Println(<-messages)
    fmt.Println(<-messages)
}

Ошибка, которую выдает:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /tmp/sandbox795158698/prog.go:23 +0x8d

Вопросы:

  1. Разве мы не можем отправить больше значений, чем размер буфера?
  2. Почему в сообщении об ошибке сказано: «все горутины спят - тупик!» когда здесь нет кодов в коде?
  3. Почему это тупик? Пожалуйста, объясните?

PlayGroundLink

1 Ответ

3 голосов
/ 30 апреля 2020

Попытка записи на полный канал будет заблокирована, пока какая-нибудь другая программа не будет читать с него. В вашей программе нет других горутин. Поэтому, когда вы пишете на полный канал, блокирует основные программы и поскольку других программ нет, нет никаких шансов на то, что основная программа сможет когда-либо прогрессировать. Это тупик.

...