Voltar ao código Go

Procesar veinte tareas con cuatro trabajadores

Un pool de goroutines con canales: concurrencia con tope, sin lanzar una rutina por tarea.

Este post ainda não está no seu idioma; você o vê em espanhol. O código é o mesmo.

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.

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 que está escrito assim

  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.
Como testar

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

Atenção

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.

O 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.

Exemplo escrito e revisado à mão.

Compartilhar

Comentários

Ainda não há comentários. O primeiro pode ser o seu.

Apenas texto, sem links. Não pedimos e-mail. Os comentários são revisados antes de serem publicados.

Adaptou para algo seu?

Me conte o que resolveu com isto, ou o que faltou.

Continue testando

Mais código

Ver todos
Darinel Ortega Online · respondo ao longo do dia
Hoje
Olá. Aqui eu não vendo nada: isto é para trocar conhecimento sobre tecnologia.
Escreva o que quiser — pode mandar texto, imagens ou documentos. As mensagens chegam ao meu console e eu respondo por lá.
Você está escrevendo fora do horário. Eu leio assim que o dia começar.

Conversa aberta para compartilhar conhecimento. As mensagens chegam ao meu console e eu respondo por lá.

Vamos marcar uma conversa

Escolha o dia e a hora que funcionem para você. Trinta minutos, sem discurso comercial.

Videochamada

Para uma videochamada, peça por aqui que eu te mando o link da sessão.