Maison > développement back-end > Golang > le corps du texte

Pourquoi devons-nous attendre la sélection dans Go ?

王林
Libérer: 2024-02-11 08:24:09
avant
1205 Les gens l'ont consulté

Pourquoi devons-nous attendre la sélection dans Go ?

L'éditeur PHP Zimo a présenté : Dans le langage Go, l'instruction select est une instruction de flux de contrôle très importante. Elle est utilisée pour surveiller les opérations de plusieurs canaux en même temps pour obtenir un contrôle de simultanéité. Pourquoi faut-il attendre la sélection ? En effet, dans la programmation simultanée, nous devons généralement traiter des données ou des événements de plusieurs canaux en même temps, et l'instruction select peut nous aider à surveiller plusieurs canaux. Une fois que l'un des canaux est opérationnel, l'opération correspondante sera effectuée. réalisant ainsi la concurrence. En utilisant select, nous pouvons efficacement éviter le blocage et améliorer la réactivité et la concurrence du programme.

Contenu de la question

Je viens d'apprendre l'annulation du contexte. Voici mon 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)
    }
  }
}
Copier après la connexion

Je veux demander

Pourquoi cela arrive-t-il. De quelles connaissances ai-je besoin ?

J'attends la sortie avec impatience.

Mais le résultat réel obtenu ne contient pas de « terminaison ».

value1
value2
pre cancel
terminate
post cancel
Copier après la connexion

Code fixe

J'ai ajouté du temps. Dormez sous la fonction d'annulation. Ensuite, le résultat est ce à quoi je m’attendais.

ctxCancel()
time.Sleep(100 * time.Millisecond) // add
Copier après la connexion

Solution de contournement

Si je comprends bien, l'idée principale derrière l'utilisation de select est d'attendre qu'au moins une condition soit "prête". J'ai inclus un exemple ci-dessous qui pourrait vous aider. Ici, la sélection est utilisée pour attendre qu'une valeur soit reçue du canal ch ou qu'un délai d'attente d'une seconde se produise.

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")
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal