Maison  >  Article  >  développement back-end  >  Pourquoi devons-nous attendre la sélection dans Go ?

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

王林
王林avant
2024-02-11 08:24:091161parcourir

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)
    }
  }
}

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

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

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")
    }
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer