ФАТАЛЬНАЯ ошибка Все программы go спят. Тупик.

Это то, что я пробовал. Я звоню wg.Done(). Чего не хватает?

package main

import (
    "fmt"
    "strconv"
    "sync"
)

func sender(wg *sync.WaitGroup, cs chan int) {
    defer wg.Done()
    for i := 0; i < 2; i++ {
        fmt.Println(i)
        cs <- i
    }
}

func reciever(wg *sync.WaitGroup, cs chan int) {
    x, ok := <-cs
    for ok {
        fmt.Println("Retrieved" + strconv.Itoa(x))
        x, ok = <-cs
        if !ok {
            wg.Done()
            break
        }
    }
}

func main() {
    wg := &sync.WaitGroup{}
    cs := make(chan int, 1000)
    wg.Add(1)
    go sender(wg, cs)
    for i := 1; i < 30; i++ {
        wg.Add(1)
        go reciever(wg, cs)
    }
    wg.Wait()
    close(cs)
}
1
Vinay Sawant 24 Фев 2016 в 15:19

2 ответа

Лучший ответ

Вы должны закрыть канал до wg.Wait.
Все ваши приемники ждут данных от канала. Вот почему у вас тупик.
Вы можете закрыть канал с помощью оператора defer функции sender.
Также вам нужно wg.Done(), если первая попытка приема с канала была неудачной (поскольку канал уже закрыт)

http://play.golang.org/p/qdEIEfY-kl

1
RoninDev 24 Фев 2016 в 12:44

Есть пара вещей:

  1. Вам нужно закрыть канал, как только отправитель будет завершен.
  2. В приемнике диапазон по каналу
  3. Не нужно добавлять 1 для группы ожидания и вызывать Done в отправителе

См. http://play.golang.org/p/vz39RY6WA7.

0
Prashant Thakkar 24 Фев 2016 в 13:00