фатальная ошибка: все горутины спят - тупик!когда канал не буферизован - PullRequest
0 голосов
/ 25 ноября 2018

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

"фатальная ошибка: все программы спят - тупик!"

package main

import "fmt"

func main() {
    ch := make(chan int)
     ch <- 1
     gg := <-ch 
     fmt.Println(gg)    
}

это работает после того, как я буферизую канал ch := make(chan int,2)

1 Ответ

0 голосов
/ 25 ноября 2018

Как отправка, так и получение данных по небуферизованному каналу являются процессами блокировки.

В своем коде вы пытались отправить числовое значение 1 через канал ch.Так как операция является блокирующей, код внизу не будет выполнен до выполнения текущей строки.

Во время выполнения оператора ch <- 1, в то же время не запущен процесс извлечения данных из канала ch.Поскольку тип канала не является буферизованным каналом, процесс отправки и получения должен происходить в одно и то же время.

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

go func () {
    ch <- 1
}()

gg := <-ch 

Рабочая площадка: https://play.golang.org/p/ceIoVQLItNk


Существует также нечто, называемое , буферизованноеканал * * тысяча двадцать-одна.Используя это, вы сможете отправлять данные по каналу несколько раз, хотя пока еще не запущен процесс извлечения данных.Но есть правило, которому нужно следовать: вы можете отправить его только n раз, в то время как n представляет номер буфера.

Пример 1: отправить данные 2 раза (буфер установлен в 3), а затем получить их:

ch := make(chan int, 3)
ch <- 1
ch <- 1
gg := <-ch

Вывод: без паники

Пример 2: отправить данные 4 раза (буфер установлен в 3), затем извлечь их:

ch := make(chan int, 3)
ch <- 1
ch <- 1
ch <- 1
ch <- 1
gg := <-ch

Вывод: фатальная ошибка: все программы спят - тупик!


Дополнительная информация: https://blog.golang.org/pipelines

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...