Ei pessoal, tudo bem?
Fazendo uso das goroutine em Go, me surgiu uma dúvida. Em alguns momentos são exibidos apenas 2 resultados no terminal. Em outros 3. Vocês sabem dizer por que isso acontece? Na ocasião possuo 3 goroutine para ser executada, e pelo que eu vi do tempo de processamento, está sendo executada as três. Mas o output em algumas execuções, só exibe o resultado de duas.
Código:
package main
import (
"buscador/internal/fetcher"
"fmt"
"sync"
"time"
)
func main() {
start := time.Now()
priceChannel := make(chan float64)
var wg sync.WaitGroup
wg.Add(3)
go func() {
var totalPrice float64
countPrices := 0.0
for price := range priceChannel {
totalPrice += price
countPrices++
avgPrice := totalPrice / countPrices
fmt.Printf("Preço recebido: R$ %.2f | Preço médio até agora: R$: %.2f \n", price, avgPrice)
}
}()
go func() {
defer wg.Done()
priceChannel <- fetcher.FetchPriceFromSite1()
}()
go func() {
defer wg.Done()
priceChannel <- fetcher.FetchPriceFromSite2()
}()
go func() {
defer wg.Done()
priceChannel <- fetcher.FetchPriceFromSite3()
}()
wg.Wait()
close(priceChannel)
fmt.Printf("\n Tempo total: %s \n", time.Since(start))
}
package fetcher
import (
"math/rand"
"time"
)
// Buscar preços de diferentes sites
func FetchPriceFromSite1() float64 {
time.Sleep(1 * time.Second)
return rand.Float64() * 100
}
func FetchPriceFromSite2() float64 {
time.Sleep(3 * time.Second)
return rand.Float64() * 100
}
func FetchPriceFromSite3() float64 {
time.Sleep(2 * time.Second)
return rand.Float64() * 100
}
Saída da execução: