Maison > développement back-end > Golang > Communication par pipeline et pratique de la concurrence goroutine des fonctions Golang

Communication par pipeline et pratique de la concurrence goroutine des fonctions Golang

王林
Libérer: 2023-05-17 13:00:22
original
974 Les gens l'ont consulté

Golang est un langage de programmation efficace doté de capacités de programmation simultanée très puissantes. Parmi eux, la communication par pipeline et la concurrence goroutine sont deux caractéristiques très importantes de Golang. Dans cet article, nous présenterons comment utiliser la communication pipeline et la concurrence goroutine des fonctions Golang pour obtenir une programmation efficace.

1. Communication par pipeline

La communication par pipeline fait référence à l'utilisation d'un pipeline pour réaliser la communication de données dans Golang. Le producteur du programme écrit les données dans le tube et le consommateur lit les données du tube. L'échange de données entre différentes goroutines est réalisé via le tube. Pour les canalisations, il existe deux types : tamponnés et non tamponnés.

Un canal mis en mémoire tampon n'a pas besoin d'attendre la lecture lors de l'écriture de données, mais stocke temporairement les données dans le canal et les lit à nouveau lorsqu'il n'y a pas de données dans le canal. Lorsqu'il y a des données mises en cache dans le pipeline, vous pouvez utiliser l'instruction select pour effectuer des opérations de lecture et d'écriture non bloquantes. Les canaux sans tampon nécessitent que les écritures et les lectures soient appariées, c'est-à-dire que les écritures attendent qu'une lecture se produise.

Ce qui suit est un exemple de code qui illustre comment utiliser les tuyaux pour mettre en œuvre la communication entre les producteurs et les consommateurs :

func main() {

ch := make(chan int)  // 创建一个整型管道
go producer(ch)       // 启动生产者函数
consumer(ch)          // 启动消费者函数
Copier après la connexion

}

// Fonction producteur, écrit des données dans le tuyau
func producteur(ch chan int) {

for i := 0; i < 10; i++ {
    ch <- i  // 将数据写入管道
}
close(ch)  // 关闭管道
Copier après la connexion

}

// Fonction consommateur, lit les données du tube
func consumer(ch chan int) {

for {
    // 非阻塞式读取管道数据
    select {
    case num, ok := <-ch:  // 获取管道的值
        if ok {
            fmt.Println("Consumer received", num)  // 打印数据
        } else {
            fmt.Println("Channel closed")
            return  // 退出函数
        }
    default:
        // 没有读取到管道数据,进行其他操作
        time.Sleep(time.Second)
    }
}
Copier après la connexion

}

Dans cet exemple, la fonction producteur transmet le tube Écrit en continu des données dans le tuyau. La fonction consommateur lit les données du canal via l'instruction select, qui est une opération de lecture non bloquante. S'il y a des données dans le pipeline, le code de l'instruction case sera exécuté, sinon l'instruction par défaut sera exécutée pour effectuer d'autres opérations.

2. Concurrence Goroutine

La goroutine dans Golang est un thread léger qui peut s'exécuter simultanément avec d'autres goroutines. La création et le fonctionnement de goroutine sont très efficaces et peuvent grandement améliorer la capacité de concurrence du programme.

Dans Golang, vous pouvez démarrer une nouvelle goroutine via le mot-clé go. Lorsqu'il y a plusieurs goroutines dans le programme, les opérations d'échange de données et de synchronisation peuvent être effectuées via des canaux et d'autres méthodes pour obtenir une programmation simultanée efficace.

Ce qui suit est un exemple de code qui illustre comment utiliser des goroutines pour implémenter des opérations simultanées :

func main() {

ch := make(chan int)  // 创建一个整型管道
for i := 0; i < 10; i++ {
    go doWork(i, ch)  // 启动10个goroutine
}
for i := 0; i < 10; i++ {
    <-ch  // 阻塞式从管道中读取数据
}
close(ch)  // 关闭管道
Copier après la connexion

}

// Travail pour chaque entier
func doWork(i int, ch chan int ) {

fmt.Println("Doing work", i)
time.Sleep(time.Second)  // 休眠1秒
ch <- i                  // 写入整型数到管道
Copier après la connexion

}

Dans cet exemple, nous créons 10 nouvelles goroutines via le mot-clé go, et effectuons des opérations d'impression et 1 seconde de sommeil dans chaque goroutine. Une fois que chaque goroutine a terminé son opération, son entier correspondant sera écrit dans le tube. Dans la fonction principale, nous utilisons la lecture bloquante pour lire 10 entiers du tube afin de garantir que chaque goroutine a terminé l'opération.

Résumé

Dans Golang, la communication par pipeline et la concurrence goroutine sont deux fonctionnalités importantes pour obtenir une programmation efficace. Grâce à la communication par pipeline, nous pouvons échanger des données entre différentes goroutines pour réaliser le découplage des programmes et leur exécution simultanée. Dans le même temps, grâce à la concurrence goroutine, nous pouvons exécuter plusieurs tâches en même temps et améliorer l'efficacité d'exécution du programme.

Il convient de noter que lorsque vous utilisez la communication par pipeline et la concurrence goroutine, vous devez prêter attention à la question de la concurrence des données. Lors d'une exécution simultanée, différentes goroutines peuvent accéder à la même variable en même temps. Nous devons utiliser les opérations atomiques ou les verrous mutex de Golang pour effectuer des opérations simultanées.

J'espère que cet article pourra vous aider à mieux comprendre l'utilisation de la communication par pipeline et de la concurrence goroutine et à l'appliquer dans la pratique.

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