Maison  >  Article  >  développement back-end  >  Comparaison des scénarios d'utilisation des canaux tamponnés et non tamponnés des canaux Golang

Comparaison des scénarios d'utilisation des canaux tamponnés et non tamponnés des canaux Golang

WBOY
WBOYoriginal
2023-08-07 23:28:461485parcourir

Golang Channels 的缓冲与非缓冲通道使用场景比较

Comparaison des scénarios d'utilisation des canaux tamponnés et non tamponnés des canaux Golang

Aperçu :
Le canal dans Golang est une primitive utilisée pour la communication entre différents Goroutines. Les canaux peuvent être de deux types : avec tampon et sans tampon. Cet article comparera ces deux types de canaux et illustrera leurs scénarios d'application avec des exemples.

Canal Bufferé :
Le canal Buffer fait référence à un canal pouvant stocker un certain nombre d'éléments. Lorsqu'une opération d'envoi (Send) se produit, si le canal est plein, le Goroutine émetteur sera bloqué jusqu'à ce que de l'espace soit disponible. Lorsqu'une opération de réception (Receive) se produit, si le canal est vide, le récepteur Goroutine sera bloqué jusqu'à ce qu'il y ait un élément à recevoir.

Ce qui suit est un exemple de code utilisant un canal tampon :

package main

import "fmt"

func main() {
    // 创建一个缓冲通道,容量为2
    ch := make(chan int, 2)

    // 发送操作
    ch <- 1
    ch <- 2

    // 接收操作
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

Dans le code ci-dessus, nous créons un canal tampon ch d'une capacité de 2. Deux éléments 1 et 2 sont envoyés via une opération d'envoi au canal ch. L'opération de réception reçoit ces deux éléments du canal ch en séquence et imprime la sortie. ch。通过向通道 ch 发送操作发送了两个元素 1 和 2。接收操作则从通道 ch 中依次接收了这两个元素,并打印输出。

非缓冲通道(Unbuffered Channel):
非缓冲通道不存储任何元素,每个发送操作和接收操作都是立即发生的。发送操作会阻塞发送者 Goroutine,直到另一个 Goroutine 进行对应的接收操作;接收操作会阻塞接收者 Goroutine,直到另一个 Goroutine 进行对应的发送操作。

以下是一个使用非缓冲通道的示例代码:

package main

import "fmt"

func main() {
    // 创建一个非缓冲通道
    ch := make(chan int)

    go func() {
        // 发送操作
        ch <- 1
        fmt.Println("发送 1 完成")
    }()

    // 接收操作
    fmt.Println(<-ch)
    fmt.Println("接收完成")
}

上述代码中,我们创建了一个非缓冲通道 ch。通过一个匿名的 Goroutine 向通道 ch

Canal sans tampon : 

Le canal sans tampon ne stocke aucun élément, et chaque opération d'envoi et de réception se produit immédiatement. L'opération d'envoi bloque le Goroutine émetteur jusqu'à ce qu'un autre Goroutine effectue l'opération de réception correspondante ; l'opération de réception bloque le Goroutine récepteur jusqu'à ce qu'un autre Goroutine effectue l'opération d'envoi correspondante.

Ce qui suit est un exemple de code utilisant un canal sans tampon :
    rrreee
  • Dans le code ci-dessus, nous créons un canal sans tampon ch. L'élément 1 est envoyé au canal ch via une Goroutine anonyme, puis imprimé. Une fois l'opération de réception effectuée dans le Goroutine principal, nous pouvons voir que l'ordre d'impression est d'imprimer d'abord "Send 1 Complete", puis d'imprimer "Receive Complete". En effet, les opérations d'envoi et de réception des canaux sans tampon sont synchrones, c'est-à-dire que l'opération d'envoi bloque le Goroutine de l'expéditeur jusqu'à ce que l'opération de réception soit terminée.
  • Comparaison des scénarios d'utilisation :
  • Les canaux tamponnés et les canaux non tamponnés ont chacun leurs propres scénarios applicables.


Le canal tampon convient aux situations où la vitesse de traitement de l'expéditeur et du destinataire est incohérente. Le canal tampon peut stocker une partie des données lorsqu'un correspondant est occupé, puis les traiter lorsqu'il est inactif, évitant ainsi le blocage Goroutine de l'envoi ou de la réception.

Les canaux sans tampon conviennent aux situations où la synchronisation doit être effectuée entre les Goroutines, lorsque les opérations d'envoi et de réception doivent avoir lieu en même temps, garantissant l'exactitude des données.

🎜🎜Conclusion : 🎜En comparant les scénarios d'utilisation des canaux tamponnés et des canaux non tamponnés, nous pouvons choisir le type de canal approprié en fonction des besoins spécifiques. Les canaux tamponnés peuvent fournir des performances de simultanéité plus élevées, mais peuvent entraîner des retards de données ; les canaux non tamponnés assurent la précision des données, mais peuvent provoquer un blocage de Goroutine. Par conséquent, nous devons choisir le type de canal raisonnablement en fonction de la situation réelle pour obtenir les meilleures performances et le meilleur effet de traitement des données. 🎜🎜Ce qui précède est une comparaison des scénarios d'utilisation des canaux avec et sans mise en mémoire tampon des canaux Golang. Grâce à l'explication et à l'explication de l'exemple de code, nous avons une meilleure compréhension et compréhension des caractéristiques et des scénarios applicables de ces deux types de canaux. 🎜

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