Concorrência em Go

Go Worker Pool

Share a queue of jobs between a fixed number of goroutines to limit how much runs at once.

  • Avançado
  • 4 min de leitura
  • 1 exemplo executável
O que você vai aprender
  • A jobs channel
  • Several workers
  • Closing results safely
6 jobs, 3 workers
  1. 1jobs1 2 3 4 5 6
  2. 23 workersn * n
  3. 3results1 4 9 16 25 36

A fixed team of workers

A worker pool starts a fixed number of goroutines that all read jobs from one channel. It limits how much work runs at the same time, which protects memory, files and network connections.

Three workers read from jobs until it is closed and send each answer to results. A separate goroutine closes results after every worker has finished, which ends the final range loop. Each result carries its job number, so the order in which workers finish does not matter.

Pontos-chave

  1. All workers read from one jobs channel.
  2. close(jobs) tells them to stop.
  3. Results are closed after every worker is done.

Exemplo executável de Go

Go
Executar código →
main.go
package main

import (
	"fmt"
	"sync"
)

func worker(jobs <-chan int, results chan<- [2]int, wg *sync.WaitGroup) {
	defer wg.Done()
	for n := range jobs {
		results <- [2]int{n, n * n}
	}
}

func main() {
	jobs := make(chan int)
	results := make(chan [2]int)
	var wg sync.WaitGroup

	for w := 0; w < 3; w++ {
		wg.Add(1)
		go worker(jobs, results, &wg)
	}

	go func() {
		for n := 1; n <= 6; n++ {
			jobs <- n
		}
		close(jobs)
	}()
	go func() {
		wg.Wait()
		close(results)
	}()

	squares := make([]int, 7)
	for result := range results {
		squares[result[0]] = result[1]
	}
	fmt.Println(squares[1:])
}
Gerar um botão Run para este exemplo Resultado da execução
[1 4 9 16 25 36]

Pratique

Abra o exemplo no compilador online, mude um valor ou adicione uma linha e tente prever a saída antes de executar. Depois quebre o código de propósito e leia a mensagem do compilador.

Terminou esta lição?

Marque como aprendida para acompanhar seu progresso.

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios