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

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

王林
Freigeben: 2024-02-11 08:24:09
nach vorne
1231 Leute haben es durchsucht

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)
    }
  }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

Fester Code

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

ctxCancel()
time.Sleep(100 * time.Millisecond) // add
Nach dem Login kopieren

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")
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage