Получение тупика Goroutine при использовании цикла for для прохождения через канал - PullRequest
0 голосов
/ 24 июня 2019

Я стараюсь практиковать распорядок дня и каналы, где я сталкиваюсь с проблемой, когда я звоню по маршруту и ​​пропускаю канал.Программа запишет данные в канал, а затем главный поток напечатает элементы.

Я использовал цикл для печати содержимого, но получаю.

fatal error: all goroutines are asleep - deadlock!

2
1
goroutine 1 [chan receive]:
main.main()
package main

import "fmt"


func smallThread(a int, c chan int) {
    c <- a
}

func main() {
    c := make(chan int)
    go smallThread(1, c)
    go smallThread(2, c)
    for {
        fmt.Println(<-c)
    }
}

РЕДАКТИРОВАТЬ : Использование группы ожидания:

func smallThread(a int, c chan int, w *sync.WaitGroup) {
    c <- a
    w.Done()
}

func main() {
    c := make(chan int)
    var w sync.WaitGroup
    w.Add(2)
    go smallThread(1, c, &w)
    go smallThread(2, c, &w)
    //w.Wait()
    for i := range c {
        fmt.Println(i)
    }
    w.Wait()
}

РЕДАКТИРОВАНИЕ2 : Рабочий код

func smallThread(a int, c chan int, w *sync.WaitGroup) {
    //defer w.Done()
    c <- a
    w.Done()
}

func main() {
    c := make(chan int)
    var w sync.WaitGroup
    w.Add(1)
    go smallThread(1, c, &w)
    w.Add(1)
    go smallThread(2, c, &w)
    go func(c chan int) {
        for i := range c {
            fmt.Println(i)
        }
    }(c)
    w.Wait()
}

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Когда выполнение процедур завершено, закройте канал, чтобы указать, что больше значений не будет добавлено. Цикл for прекратится после получения всех значений.

c := make(chan int)
var w sync.WaitGroup
w.Add(2)
go smallThread(1, c, &w)
go smallThread(2, c, &w)
go func() {
    w.Wait()
    close(c)
}()

for i := range c {
    fmt.Println(i)
}
0 голосов
/ 24 июня 2019

Не уверен, что ваш вопрос, но я скажу вам, что происходит. Ваши две боковые программы вставляют свои номера в канал и выходят. Тогда основная программа (единственная, оставшаяся в этой точке) будет блокироваться навсегда, ожидая, пока другой элемент не выйдет из канала.

...