Maison >développement back-end >Golang >Un guide pratique pour la programmation simultanée Select Channels Go à l'aide de Golang

Un guide pratique pour la programmation simultanée Select Channels Go à l'aide de Golang

PHPz
PHPzoriginal
2023-09-27 21:54:31676parcourir

利用golang进行Select Channels Go并发式编程的实践指南

Un guide pratique pour la programmation simultanée Select Channels Go à l'aide de golang

Introduction :
Dans les applications informatiques modernes, la simultanéité élevée devient de plus en plus importante. Afin d'utiliser pleinement les performances de l'ordinateur, nous devons utiliser la programmation simultanée pour réaliser le multitâche. Golang est un langage de programmation haute performance qui prend en charge la programmation simultanée. Il fournit un mécanisme appelé « Canaux » pour implémenter la communication simultanée. En utilisant les instructions Channels et Select, nous pouvons facilement implémenter la programmation simultanée. Cet article vous expliquera comment utiliser les instructions Channels et Select dans Golang pour la programmation simultanée et fournira des exemples de code spécifiques.

1. Le concept de base des canaux
Dans Golang, Channel est un mécanisme de communication utilisé pour transférer des données entre Goroutines (fonctions exécutées simultanément). Il peut être considéré comme un canal entre les Goroutines à travers lequel les données circulent. Le canal a deux fonctionnalités importantes : le blocage et la synchronisation.

  1. Blocage : Lorsqu'un Goroutine envoie des données à un canal, si le canal est plein, l'opération d'envoi sera bloquée jusqu'à ce que le canal ait à nouveau une position libre. De même, si un Goroutine reçoit des données d'un canal, mais que le canal est vide, l'opération de réception sera bloquée jusqu'à ce que les données soient disponibles dans le canal.
  2. Synchronisation : le canal peut être utilisé pour la synchronisation entre les Goroutines. Lorsqu'un Goroutine envoie des données à un canal, il attend que le Goroutine récepteur reçoive les données avant de continuer. De même, lorsqu'un Goroutine reçoit des données d'un canal, il attendra que le Goroutine émetteur ait fini d'envoyer les données avant de continuer.

2. Utilisez l'instruction Select
Dans Golang, l'instruction Select est un mécanisme utilisé pour gérer plusieurs opérations de canal. Elle est similaire à une instruction switch, mais est utilisée pour gérer les opérations de lecture et d'écriture sur un canal.

  1. Syntaxe de l'instruction Select

    select {
    case channel1 <- data1:
     // 当 channel1 可用时执行
    case data2 := <-channel2:
     // 当 channel2 可用时执行
    case data3, ok := <-channel3:
     // 当 channel3 可用时执行
     // 如果 Channel 被关闭,ok 会被设置为 false,否则为 true
    default:
     // 如果没有任何 Channel 操作可用,则执行 default 语句块
    }
  2. Principe de fonctionnement de l'instruction Select
  3. Lorsque plusieurs canaux sont disponibles, Select sélectionnera au hasard un canal disponible pour effectuer les opérations associées.
  4. Si aucun canal n'est disponible et qu'il n'y a pas de bloc d'instructions par défaut, l'instruction Select se bloquera jusqu'à ce qu'au moins un canal soit disponible.
  5. S'il y a plusieurs canaux disponibles et qu'il n'y a pas de bloc d'instructions par défaut, l'instruction Select sélectionnera au hasard un canal disponible pour effectuer les opérations associées. Par conséquent, si plusieurs chaînes sont disponibles, nous ne pouvons pas prédire quelle chaîne sera sélectionnée.

3. Guide pratique
Voici quelques directives pratiques pour l'utilisation des chaînes et des instructions Select :

  1. Création d'une chaîne
    Utilisez la fonction make intégrée pour créer une chaîne. L'exemple de code est le suivant :

    ch := make(chan int)
  2. Envoi et réception de données
    Utilisez l'opérateur <- pour envoyer et recevoir des données vers Channel. L'exemple de code est le suivant :

    ch <- data // 发送数据
    data := <-ch // 接收数据
  3. Utilisez l'instruction Select pour les opérations simultanées
    Utilisez l'instruction Select pour gérer plusieurs opérations de canal. L'exemple de code est le suivant :

    select {
    case ch1 <- data1:
     // 当 ch1 可用时执行发送操作
    case data2 := <-ch2:
     // 当 ch2 可用时执行接收操作
    }
  4. Fermer la chaîne
    Utilisez la fonction de fermeture intégrée pour fermer une chaîne. L'exemple de code est le suivant :

    close(ch)
  5. Simulation de tâches simultanées
    Les Goroutines et les canaux peuvent être utilisés pour simuler des tâches exécutées simultanément. L'exemple de code est le suivant :

    func worker(id int, jobs <-chan int, results chan<- int) {
     for j := range jobs {
         fmt.Println("Worker", id, "started job", j)
         time.Sleep(time.Second)
         fmt.Println("Worker", id, "finished job", j)
         results <- j * 2
     }
    }
    
    func main() {
     // 创建输入和输出 Channels
     jobs := make(chan int, 100)
     results := make(chan int, 100)
    
     // 创建并发 Goroutines
     for w := 1; w <= 3; w++ {
         go worker(w, jobs, results)
     }
    
     // 发送任务到输入 Channel
     for j := 1; j <= 9; j++ {
         jobs <- j
     }
     close(jobs)
    
     // 输出结果
     for a := 1; a <= 9; a++ {
         <-results
     }
    }

Cet article explique comment utiliser les instructions Channels et Select dans Golang pour la programmation simultanée. En utilisant les instructions Channels et Select, nous pouvons facilement implémenter des tâches simultanées. J'espère que cet article pourra vous aider à mieux comprendre le mécanisme de programmation simultanée de Golang et vous fournir des conseils utiles pour vos projets.

Références :

  1. "Concurrency in Go", The Go Blog, [En ligne]. Disponible : https://blog.golang.org/concurrency-is-not-parallelism.
  2. "Effective Go", The Go Langage de programmation, [En ligne] : https://golang.org/doc/effective_go.html.

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