Procesar veinte tareas con cuatro trabajadores
Un pool de goroutines con canales: concurrencia con tope, sin lanzar una rutina por tarea.
El problema
Hay que procesar muchos pedidos que tardan (una llamada, un archivo). Uno por uno es lento; todos a la vez tumba al servicio del otro lado. Hace falta un número fijo de trabajadores.
package main
import (
"fmt"
"sync"
"time"
)
func procesar(id int) string {
time.Sleep(100 * time.Millisecond) // simula trabajo: una llamada, un archivo
return fmt.Sprintf("pedido %d listo", id)
}
func main() {
trabajos := make(chan int)
resultados := make(chan string)
var wg sync.WaitGroup
for w := 0; w < 4; w++ { // cuatro trabajadores, no uno por pedido
wg.Add(1)
go func() {
defer wg.Done()
for id := range trabajos {
resultados <- procesar(id)
}
}()
}
go func() {
for id := 1; id <= 20; id++ {
trabajos <- id
}
close(trabajos)
wg.Wait()
close(resultados)
}()
for r := range resultados {
fmt.Println(r)
}
}
Por qué está escrito así
- Los cuatro trabajadores leen del mismo canal: Go reparte cada pedido a quien esté libre.
- Cerrar el canal de trabajos es la señal de "no hay más": cada for range termina solo.
- El WaitGroup espera a que los cuatro terminen antes de cerrar resultados; cerrarlo antes haría entrar en pánico al programa.
- Veinte tareas de 100 ms tardan medio segundo en vez de dos.
Guardalo como main.go y corré: go run main.go. Cambiá el 4 por 1 y por 20 para ver la diferencia de tiempo.
Los resultados llegan en el orden en que terminan, no en el que entraron. Si el orden importa, mandá el índice junto con el resultado y ordená al final.
Adaptalo a tu caso con IA
El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.
Tengo este pool de trabajadores en Go. Adaptalo para que cada tarea sea [QUÉ HACE CADA TAREA], propague errores sin detener a las demás, respete un context con tiempo límite de [SEGUNDOS] segundos y devuelva los resultados en el orden original. Explicame en tres líneas cómo elegir el número de trabajadores para mi caso.
Ejemplo escrito y revisado a mano.
Comentarios
Todavía no hay comentarios. El primero puede ser el tuyo.
¿Lo adaptaste a algo tuyo?
Contame qué resolviste con esto, o qué le faltó.