Я столкнулся с проблемой параллелизма.Я пишу параллельное приложение впервые.
То, что я пытаюсь достичь
Зависимые функции (с помощью 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
(Голангнуби)