Concurrencia en Go

Go Worker Pool

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

  • Avanzado
  • 4 min de lectura
  • 1 ejemplo ejecutable
Lo que aprenderás
  • 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.

Puntos clave

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

Ejemplo ejecutable de Go

Go
Ejecutar 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:])
}
Obtén un botón Run para este ejemplo Resultado de ejecutar el código
[1 4 9 16 25 36]

Practica

Abre el ejemplo en el compilador online, cambia un valor o añade una línea y predice la salida antes de ejecutarlo. Después rompe el código a propósito y lee el mensaje del compilador.

¿Terminaste esta lección?

Márcala como aprendida para seguir tu progreso.

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos