Concurrencia en Go

Go select and Timeouts

Wait on several channels at once, give up after a timeout, or check without waiting.

  • Avanzado
  • 4 min de lectura
  • 1 ejemplo ejecutable
Lo que aprenderás
  • select with several cases
  • time.After
  • default
select
case <-fastready after 10 ms
case <-slowready after 200 ms
case <-time.After(50ms)timeout

The first ready channel wins

select waits for the first of several channel operations that is ready. It is how a goroutine listens to more than one channel, adds a timeout, or checks a channel without waiting.

The first select receives from fast because it is ready first. In the second, time.After delivers a value after 50 milliseconds, before slow is ready, so the timeout case runs. A default case runs at once when no channel is ready.

Puntos clave

  1. select runs the first case that is ready.
  2. time.After adds a timeout.
  3. default runs when nothing is ready.

Ejemplo ejecutable de Go

Go
Ejecutar código →
main.go
package main

import (
	"fmt"
	"time"
)

func main() {
	fast := make(chan string)
	slow := make(chan string)

	go func() {
		time.Sleep(10 * time.Millisecond)
		fast <- "fast result"
	}()
	go func() {
		time.Sleep(200 * time.Millisecond)
		slow <- "slow result"
	}()

	select {
	case message := <-fast:
		fmt.Println(message)
	case message := <-slow:
		fmt.Println(message)
	}

	select {
	case message := <-slow:
		fmt.Println(message)
	case <-time.After(50 * time.Millisecond):
		fmt.Println("timed out waiting for slow")
	}

	ready := make(chan int)
	select {
	case value := <-ready:
		fmt.Println(value)
	default:
		fmt.Println("nothing ready, moving on")
	}
}
Obtén un botón Run para este ejemplo Resultado de ejecutar el código
fast result
timed out waiting for slow
nothing ready, moving on

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