Procesar veinte tareas con cuatro trabajadores
Un pool de goroutines con canales: concurrencia con tope, sin lanzar una rutina por tarea.
O 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 que está escrito assim
- 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.
Adapte ao seu caso com IA
O botão copia este prompt com o código colado abaixo. Substitua os colchetes pelo que é seu e cole no ChatGPT, Claude, Gemini ou 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.
Exemplo escrito e revisado à mão.
Comentários
Ainda não há comentários. O primeiro pode ser o seu.
Adaptou para algo seu?
Me conte o que resolveu com isto, ou o que faltou.