Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Espera da execução da goroutine em Go.

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:

Imagem contendo a saída da execução de um código go

2 respostas
solução!

Dúvida respondida na aula seguinte! Valeeu!

Oii, Pedro. Tudo bem?

Que bom que deu tudo certo. Irei finalizar o seu tópico.

Um abraço.