Nebenläufigkeit in Go

Go select and Timeouts

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

  • Profi
  • 4 Min. Lesezeit
  • 1 ausführbares Beispiel
Das lernst du
  • 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.

Das Wichtigste

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

Ausführbares Go-Beispiel

Go
Code ausführen →
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")
	}
}
Run-Button für dieses Beispiel erstellen Ergebnis der Ausführung
fast result
timed out waiting for slow
nothing ready, moving on

Üben

Öffne das Beispiel im Online-Compiler, ändere einen Wert oder füge eine Zeile hinzu und sage die Ausgabe voraus, bevor du es ausführst. Bring den Code danach absichtlich zum Scheitern und lies die Meldung des Compilers.

Lektion fertig?

Markiere sie als gelernt, um deinen Fortschritt zu verfolgen.

Mit einer Challenge üben

Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.

Alle Challenges