Maison > développement back-end > Golang > Comment puis-je récupérer les valeurs de retour des Goroutines exécutées de manière asynchrone dans Go ?

Comment puis-je récupérer les valeurs de retour des Goroutines exécutées de manière asynchrone dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-26 01:03:11
original
269 Les gens l'ont consulté

How Do I Retrieve Return Values from Asynchronously Running Goroutines in Go?

Capturer les valeurs de retour des goroutines

Contrairement aux appels de fonction conventionnels, les goroutines s'exécutent de manière asynchrone. Par conséquent, tenter de stocker la valeur de retour d'une goroutine directement dans une variable, comme le montre l'extrait de code, entraîne une erreur de compilation.

Raison de l'erreur

L'erreur provient de la nature conflictuelle de l'exécution asynchrone et de la récupération immédiate de la valeur. Lorsque vous utilisez une goroutine avec go, vous demandez au programme d'exécuter la fonction de manière asynchrone, sans attendre son achèvement. Cependant, l'attribution de la valeur de retour à une variable nécessite que la valeur soit disponible immédiatement.

Canaux : un mécanisme de transmission de valeur asynchrone

Pour contourner cette limitation, les canaux servent comme intermédiaires pour l’échange de valeurs entre goroutines. Les canaux vous permettent d'envoyer des valeurs d'une goroutine à une autre, permettant une récupération de valeurs asynchrone sans rompre la concurrence.

La mise en œuvre d'une approche basée sur les canaux, comme illustrée dans le code ci-dessous, vous permet de recevoir des valeurs des goroutines sans compromettre leur nature asynchrone :

func main() {
    c1 := make(chan string)
    c2 := make(chan string)

    go func() {
        time.Sleep(time.Second * 1)
        c1 <- "one"
    }()
    go func() {
        time.Sleep(time.Second * 2)
        c2 <- "two"
    }()

    for i := 0; i < 2; i++ {
        // Receive values from both channels concurrently
        select {
        case msg1 := <-c1:
            fmt.Println("received", msg1)
        case msg2 := <-c2:
            fmt.Println("received", msg2)
        }
    }
}
Copier après la connexion

Passage de messages et CSP Théorie

Le système de messagerie de Go s'inspire de la théorie CSP (Communicating Sequential Processes). Cette approche favorise la transmission de messages comme principal mécanisme de communication entre processus indépendants. L'exemple de code suit les principes de CSP en utilisant des canaux pour la communication asynchrone entre les goroutines.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal