Как сторона получателя узнает, что данные по одному каналу были пусты, если несколько отправителей отправляют данные по этому каналу? - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть простой пример, и я не знаю, как это исправить, чтобы он работал так, как я ожидал.

Должно быть напечатано Result: 30, но на экране появилось: Неустранимая ошибка: все программы спят - тупик!

Я думаю, что проблема здесь заключается в утверждении for val := range data.Он все еще ждет получения данных, когда канал данных был пуст.Но я не знаю, как это решить, пожалуйста, помогите мне.

package main

import (
    "fmt"
)

func senderSide(data chan int) {
    num := 5
    for i := 1; i <= num; i++ {
        data <- i
    }
    // close(data) //panic: send on closed channel if uncomment it
}

func receiverSide(data chan int, resp chan int) {
    sum := 0
    for val := range data {
        sum += val
    }
    resp <- sum
}

func main() {
    data := make(chan int)
    resp := make(chan int)
    go senderSide(data)
    go senderSide(data)
    go receiverSide(data, resp)
    result := <-resp
    fmt.Printf("Result: %v\n", result) //result = 30
}

1 Ответ

0 голосов
/ 10 декабря 2018

Я не совсем понимаю ваш вопрос, но тупик легко объяснить.Вы никогда не закрываете data chan, поэтому цикл в recevierSide никогда не закрывается, потому что он постоянно ожидает большего количества данных.

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

...