Нужно ли создавать новые группы ожидания после завершения ожидания? - PullRequest
0 голосов
/ 09 февраля 2019

Я столкнулся с проблемой параллелизма.Я пишу параллельное приложение впервые.

То, что я пытаюсь достичь

Зависимые функции (с помощью goroutines), т. Е. func2 зависит от результата func1

Проблема

Если я снова использую группу ожидания после того, как это будет сделано Ожидание Я получаю ошибку как

fatal error: all goroutines are asleep - deadlock!

Вот мой код ( Детская площадка ):

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    wg := sync.WaitGroup{}
    ch := make(chan int)
    for a := 0; a < 3; a++ {
        wg.Add(1)
        go func1(int(3-a), ch, &wg)
    }
    go func() {
        wg.Wait()
        close(ch)
    }()
    //wg2 := sync.WaitGroup{} //<-- If I uncomment this and the corresponding wg2 code, then the snippet runs fine
    ch2 := make(chan string)
    for val := range ch {
        fmt.Println(val)
        wg.Add(1)
        //wg2.Add(1)
        go func2(val, ch2, &wg)
        //go func2(val, ch2, &wg2)
    }
    go func() {
        wg.Wait()
        //wg2.Wait()
        close(ch2)
    }()
    for val := range ch2 {
        fmt.Println(val)
    }
}

func func1(seconds int, ch chan<- int, wg *sync.WaitGroup) {
    defer wg.Done()
    time.Sleep(time.Duration(seconds) * time.Second)
    ch <- seconds
}

func func2(seconds int, ch chan<- string, wg *sync.WaitGroup) {
    defer wg.Done()
    ch <- "hello"
}


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

Спасибо
Temporarya
(Голангнуби)

1 Ответ

0 голосов
/ 09 февраля 2019

WaitGroups можно безопасно использовать для повторного использования, но не ясно, для чего вы используете сторонний пакет для этого?Особенно, если вы только изучаете параллелизм, я настоятельно рекомендую вам придерживаться стандартной библиотеки - sync.WaitGroup - это то, что вам нужно.

FWIW, если я изменю ваш код для использования sync.WaitGroup, это нене заходит в тупик и работает до конца - см. эту игровую площадку

В этом блог-посте Go объясняется, как безопасно выполнять конвейеризацию с каналами, а в некоторых более сложных случаях ожидают группы(они тебе не всегда нужны)

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