Sobes.tech
Junior — Middle

Como organizar e gerir a sequência de execução dos threads?

sobes.tech IA

Resposta da IA

Em Go, para organizar e gerir a sequência de execução de goroutines, utilizam-se vários mecanismos principais:

  1. Canais (channels) — permitem sincronizar as goroutines, transmitindo dados entre elas. Uma goroutine que lê de um canal aguardará até que outra goroutine envie dados, garantindo a ordem.

  2. sync.WaitGroup — é usado para esperar que um grupo de goroutines termine. Permite aguardar até que todas as goroutines em execução sejam concluídas.

  3. Mutex e outras primitivas do pacote sync — para proteger recursos partilhados e evitar condições de corrida.

Exemplo de uso de canais para execução sequencial:

package main

import (
    "fmt"
)

func worker(id int, done chan bool) {
    fmt.Printf("Trabalhador %d iniciado\n", id)
    // simulação de trabalho
    done <- true // sinal de conclusão
}

func main() {
    done := make(chan bool)

    go worker(1, done)
    <-done // espera pela conclusão do trabalhador 1

    go worker(2, done)
    <-done // espera pela conclusão do trabalhador 2

    fmt.Println("Todos os trabalhadores concluíram")
}

Desta forma, usando canais e sincronização, é possível gerir a ordem de execução das goroutines.