Maison >développement back-end >Golang >Implémenter une programmation simultanée Select Channels Go plus flexible via Golang

Implémenter une programmation simultanée Select Channels Go plus flexible via Golang

王林
王林original
2023-09-28 13:45:02711parcourir

通过golang实现更加灵活的Select Channels Go并发式编程

Obtenez une programmation simultanée Select Channels Go plus flexible grâce à golang

Introduction :
Le langage Go est privilégié par les développeurs pour sa syntaxe concise et ses puissantes fonctionnalités de concurrence. Parmi eux, en combinant des canaux et des instructions sélectionnées, nous pouvons réaliser une programmation simultanée efficace et flexible. Cet article présentera comment implémenter une programmation simultanée Select Channels Go plus flexible via Golang à travers des exemples de code spécifiques.

1. Que sont les déclarations et les canaux Select ?
Avant de présenter la programmation simultanée flexible Select Channels Go, comprenons d'abord les concepts d'instructions et de canaux sélectionnés.

1.1 Instruction Select
L'instruction select est une instruction de contrôle de flux en langage Go, utilisée pour sélectionner parmi plusieurs opérations de canal. Il peut être utilisé pour surveiller le flux de données de plusieurs canaux et effectuer les opérations correspondantes lorsqu'il existe des données lisibles ou inscriptibles dans l'un des canaux.

1.2 Canaux
Le canal est un type spécial du langage Go utilisé pour la communication dans un environnement concurrent. Il peut être utilisé pour transférer des données entre différentes goroutines afin d'obtenir la coordination et la synchronisation.

2. Programmation simultanée flexible Select Channels Go

2.1 Basic Select Channels Go programmation simultanée
Tout d'abord, examinons un exemple simple pour montrer comment implémenter la programmation simultanée de base via des canaux et des instructions de sélection.

package main

import (
    "fmt"
    "time"
)

func printer(c chan string) {
    for {
        msg := <-c
        fmt.Println(msg)
        time.Sleep(time.Second)
    }
}

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

    go printer(c1)
    go printer(c2)

    for i := 0; i < 5; i++ {
        c1 <- "Hello"
        c2 <- "World"
        time.Sleep(time.Second)
    }
}

Dans le code ci-dessus, nous avons créé deux canaux de type chaîne c1 et c2, puis avons démarré les goroutines des deux fonctions d'imprimante respectivement. Dans la fonction principale, nous envoyons des données aux deux fonctions d'imprimante via c1 et c2. Dans la fonction imprimante, deux canaux sont surveillés via l'instruction select. Une fois les données lisibles dans l'un des canaux, l'opération d'impression correspondante est effectuée.

2.2 Programmation simultanée Select Channels Go avec fonction de délai d'attente
Dans l'exemple ci-dessus, nous avons utilisé time.Sleep pour simuler des opérations retardées. Cependant, dans la programmation simultanée réelle, nous devons souvent faire face à des situations de dépassement de délai.

package main

import (
    "fmt"
    "time"
)

func printer(c chan string) {
    for {
        select {
        case msg := <-c:
            fmt.Println(msg)
        case <-time.After(time.Second * 3):
            fmt.Println("Timeout")
        }
    }
}

func main() {
    c := make(chan string)

    go printer(c)

    c <- "Hello"
    time.Sleep(time.Second * 2)
}

Dans le code ci-dessus, nous avons modifié la fonction d'imprimante et ajouté une instruction select. Dans l'instruction select, nous utilisons la fonction time.After pour créer un canal avec une fonction timeout. Si aucune donnée n'est reçue de c dans les 3 secondes, une opération d'impression avec délai d'attente est effectuée.

2.3 Select Channels Go Concurrent Programming with Default Conditions
Parfois, nous pouvons avoir besoin d'ajouter des conditions par défaut à l'instruction select pour éviter le blocage du programme.

package main

import (
    "fmt"
    "time"
)

func printer(c1 chan string, c2 chan string) {
    for {
        select {
        case msg := <-c1:
            fmt.Println(msg)
        case msg := <-c2:
            fmt.Println(msg)
        default:
            fmt.Println("No data received")
            time.Sleep(time.Second)
        }
    }
}

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

    go printer(c1, c2)

    time.Sleep(time.Second * 2)
}

Dans le code ci-dessus, nous avons modifié la fonction d'imprimante et ajouté une branche par défaut. Lorsqu'aucune donnée n'est reçue, « Aucune donnée reçue » est imprimé par défaut.

Conclusion : 
Grâce à l'instruction select et aux canaux de golang, nous pouvons facilement mettre en œuvre une programmation simultanée efficace et flexible. Grâce aux exemples ci-dessus, nous pouvons comprendre comment utiliser essentiellement les instructions et les canaux de sélection, et comment ajouter des délais d'attente et des conditions par défaut. Grâce à ces techniques, nous pouvons écrire des programmes concurrents efficaces et robustes.

La pratique est le meilleur moyen d'améliorer vos compétences. Je vous encourage à essayer d'écrire plus de code vous-même et à maîtriser l'utilisation d'instructions et de canaux sélectionnés par la pratique. Ce n'est que par une pratique continue que nous pourrons véritablement maîtriser l'essence de la programmation simultanée.

J'espère que cet article vous aidera à comprendre et à appliquer Golang pour obtenir une programmation simultanée Select Channels Go plus flexible !

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:
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