Volver al código Go

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.

Go
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í

  1. Los cuatro trabajadores leen del mismo canal: Go reparte cada pedido a quien esté libre.
  2. Cerrar el canal de trabajos es la señal de "no hay más": cada for range termina solo.
  3. El WaitGroup espera a que los cuatro terminen antes de cerrar resultados; cerrarlo antes haría entrar en pánico al programa.
  4. Veinte tareas de 100 ms tardan medio segundo en vez de dos.
Cómo probarlo

Guardalo como main.go y corré: go run main.go. Cambiá el 4 por 1 y por 20 para ver la diferencia de tiempo.

Ojo con esto

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.

El prompt
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.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.