Heim  >  Artikel  >  Backend-Entwicklung  >  Warum müssen wir in Go auf die Auswahl warten?

Warum müssen wir in Go auf die Auswahl warten?

王林
王林nach vorne
2024-02-11 08:24:091201Durchsuche

Warum müssen wir in Go auf die Auswahl warten?

PHP-Editor Zimo eingeführt: In der Go-Sprache ist die Select-Anweisung eine sehr wichtige Kontrollflussanweisung. Sie wird verwendet, um den Betrieb mehrerer Kanäle gleichzeitig zu überwachen, um eine Parallelitätskontrolle zu erreichen. Warum müssen Sie auf die Auswahl warten? Dies liegt daran, dass wir bei der gleichzeitigen Programmierung normalerweise Daten oder Ereignisse von mehreren Kanälen gleichzeitig verarbeiten müssen und die Select-Anweisung uns dabei helfen kann, mehrere Kanäle zu überwachen. Sobald einer der Kanäle betriebsbereit ist, wird die entsprechende Operation ausgeführt. Dadurch wird Parallelität erreicht. Durch die Verwendung von select können wir Blockierungen effektiv vermeiden und die Reaktionsfähigkeit und Parallelität des Programms verbessern.

Frageninhalt

Ich habe gerade die Kontextaufhebung gelernt. Hier ist mein Code.

package main

import (
  "fmt"
  "context"
)

func main() {
  ctx := context.Background()

  do(ctx)
}

func do(ctx context.Context) {
  ctx, ctxCancel := context.WithCancel(ctx)

  resultCh := make(chan string)

  go terminate(ctx, resultCh)

  resultCh <- "value1"
  resultCh <- "value2"

  fmt.Println("pre cancel")

  ctxCancel()

  fmt.Println("post cancel")
}

func terminate(ctx context.Context, ch <-chan string) {
  for {
    select {
    case <-ctx.Done():
      fmt.Println("terminate")
      return
    case result := <-ch:
      fmt.Println(result)
    }
  }
}

Möchte fragen

Warum passiert das? Welche Kenntnisse benötige ich?

Ich freue mich auf die Ausgabe.

Aber die tatsächlich erhaltene Ausgabe enthält keine „Beendigung“.

value1
value2
pre cancel
terminate
post cancel

Fester Code

Ich habe time.Sleep unter der Abbruchfunktion hinzugefügt. Dann entspricht die Ausgabe meinen Erwartungen.

ctxCancel()
time.Sleep(100 * time.Millisecond) // add

Workaround

So wie ich es verstehe, besteht die Kernidee hinter der Verwendung von „select“ darin, darauf zu warten, dass mindestens eine Bedingung „bereit“ ist. Ich habe unten ein Beispiel bereitgestellt, das hilfreich sein könnte. Hier wird „select“ verwendet, um auf den Empfang eines Werts vom Kanal ch oder auf das Eintreten einer Zeitüberschreitung von 1 Sekunde zu warten.

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)

    go func() {
        // Simulate some time-consuming operation
        time.Sleep(2 * time.Second)
        ch <- 42
    }()

    select {
    case result := <-ch:
        fmt.Println("Received result:", result)
    case <-time.After(1 * time.Second):
        fmt.Println("Timeout reached")
    }
}

Das obige ist der detaillierte Inhalt vonWarum müssen wir in Go auf die Auswahl warten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen