Maison  >  Article  >  développement back-end  >  Golang implémente la file d'attente tampon

Golang implémente la file d'attente tampon

WBOY
WBOYoriginal
2023-05-13 10:58:37639parcourir

La file d'attente tampon est une structure de données commune qui joue un rôle important dans les programmes multithread. Golang fournit des canaux intégrés pour implémenter des files d'attente de tampons, qui peuvent facilement implémenter la communication et le transfert de données entre les threads. Cet article présentera comment Golang implémente la file d'attente tampon.

  1. Introduction aux canaux

Les canaux sont un mécanisme utilisé pour la communication entre plusieurs threads dans le langage Golang. Un canal peut être considéré comme un canal par lequel plusieurs threads peuvent envoyer et recevoir des données. L'envoi et la réception de données dans le canal sont bloquants, ce qui signifie que s'il n'y a pas de données dans le canal ou si le canal est plein, l'expéditeur ou le destinataire sera bloqué. Les canaux peuvent être créés à l'aide de la fonction make, avec la syntaxe suivante :

make(chan 数据类型, 缓冲区大小)

où le type de données est le type de données dans le canal et la taille du tampon est facultative. Si la taille du tampon n'est pas spécifiée, la valeur par défaut est 0, ce qui correspond à un canal sans tampon. La syntaxe pour créer un canal sans tampon est la suivante :

make(chan 数据类型)
  1. Implémentation d'une file d'attente tampon

En Golang, une file d'attente tampon peut être implémentée via des canaux intégrés. L'implémentation spécifique est la suivante :

package main

import "fmt"

func main() {
    // 创建缓冲队列
    queue := make(chan int, 10)

    // 发送数据到缓冲队列
    queue <- 1
    queue <- 2
    queue <- 3

    // 从缓冲队列中读取数据
    fmt.Println(<-queue)
    fmt.Println(<-queue)
    fmt.Println(<-queue)
}

Le code ci-dessus crée un canal avec une taille de tampon de 10, envoie trois entiers 1, 2 et 3 au canal et lit ces trois entiers à partir du canal. La syntaxe de lecture des données est <-queue, ce qui signifie lire les données du canal. Notez que si l'opération de lecture est exécutée avant l'opération d'envoi, le thread sera bloqué. <-queue,表示从通道中读取数据。注意,如果读取操作先于发送操作执行,会导致线程阻塞。

除了以上的读取、发送操作,还可以使用len(queue)

En plus des opérations de lecture et d'envoi ci-dessus, vous pouvez également utiliser la fonction len(queue) pour obtenir la longueur de la file d'attente, qui est utilisée pour déterminer si la file d'attente est pleine ou vide.
  1. Implémentation simultanée du modèle producteur-consommateur

Les files d'attente tampon sont généralement utilisées pour implémenter le modèle producteur-consommateur afin de transférer des données entre plusieurs threads. Ce qui suit est un exemple de programme simple qui implémente un producteur et deux consommateurs :

package main

import (
    "fmt"
    "time"
)

func producer(queue chan<- int) {
    // 生产者往队列中写入数据
    for i := 1; i <= 10; i++ {
        queue <- i
        fmt.Printf("生产者写入数据:%d
", i)
        time.Sleep(time.Millisecond * 100)
    }
}

func consumer1(queue <-chan int) {
    // 消费者1从队列中读取数据
    for {
        data := <-queue
        fmt.Printf("消费者1读取数据:%d
", data)
        time.Sleep(time.Millisecond * 200)
    }
}

func consumer2(queue <-chan int) {
    // 消费者2从队列中读取数据
    for {
        data := <-queue
        fmt.Printf("消费者2读取数据:%d
", data)
        time.Sleep(time.Millisecond * 200)
    }
}

func main() {
    // 创建缓冲队列
    queue := make(chan int, 5)

    // 启动生产者协程
    go producer(queue)

    // 启动两个消费者协程
    go consumer1(queue)
    go consumer2(queue)

    // 等待协程执行结束
    time.Sleep(time.Second * 10)
}

Le programme ci-dessus crée un canal avec une taille de tampon de 5, démarre une coroutine de producteur et deux coroutines de consommateur. La coroutine productrice écrit les données sur le canal et la coroutine consommatrice lit les données du canal. Puisque la taille du tampon est de 5, le producteur peut continuer à écrire des données dans la file d'attente lorsque celle-ci n'est pas pleine. La coroutine consommateur lit les données de la file d'attente toutes les 200 millisecondes et les imprime. Une fois le programme terminé, la coroutine principale attend que toutes les coroutines terminent leur exécution.
  1. Résumé

golang fournit des canaux intégrés pour implémenter des files d'attente de tampon. La communication et le transfert de données entre plusieurs threads peuvent être réalisés via des canaux, réalisant ainsi des modèles de programmation simultanés tels que le modèle producteur-consommateur. Les développeurs peuvent implémenter leurs propres solutions de programmation simultanée basées sur les canaux intégrés de Golang. 🎜

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
Article précédent:golang 1.7 j'ai changéArticle suivant:golang 1.7 j'ai changé