Maison  >  Article  >  développement back-end  >  Comment choisir d'utiliser des canaux tamponnés ou non dans Golang

Comment choisir d'utiliser des canaux tamponnés ou non dans Golang

PHPz
PHPzoriginal
2023-08-07 15:25:471050parcourir

Golang 中如何选择使用缓冲或非缓冲 Channels

Comment choisir d'utiliser les canaux tamponnés ou non dans Golang

En langage Go, Channel est un mécanisme utilisé pour la communication entre Goroutines. Lors de l'utilisation de Channel, nous devons choisir d'utiliser un canal tamponné ou non tamponné. Cet article explique quand vous devez choisir d'utiliser un canal avec mise en mémoire tampon et quand vous devez choisir d'utiliser un canal sans tampon, et donne des exemples de code correspondants.

  1. Canal sans tampon

Canal sans tampon signifie que lors de l'envoi de données, l'expéditeur sera bloqué jusqu'à ce qu'un Goroutine reçoive les données. De même, lors de la réception de données, le récepteur sera également bloqué jusqu'à ce qu'un Goroutine envoie des données. L'exemple de code d'un canal non tamponné est le suivant :

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)

    go func() {
        time.Sleep(time.Second)
        ch <- 1 // 发送数据到Channel
        fmt.Println("数据已发送")
    }()

    fmt.Println("等待数据中...")
    data := <-ch // 接收Channel中的数据
    fmt.Println("接收到数据:", data)
}

Dans cet exemple, nous créons un canal non tamponné ch. Dans le Goroutine anonyme, nous attendons 1 seconde puis envoyons les données 1 au Channel. Attendez les données dans le Goroutine principal et imprimez-les après avoir reçu les données. En raison de l'utilisation d'un canal non tamponné, l'opération d'envoi de données bloquera le Goroutine principal jusqu'à ce que les données soient reçues avant que l'exécution puisse continuer. ch。在匿名Goroutine中,我们等待1秒钟,然后将数据1发送到Channel中。在主Goroutine中等待数据,并接收到数据后打印出来。由于使用了非缓冲Channel,发送数据的操作会阻塞主Goroutine,直到数据被接收后才能继续执行。

当我们需要确保发送和接收的顺序时,或者需要同步两个Goroutine之间的操作时,非缓冲Channel是一个很好的选择。

  1. 缓冲Channel

缓冲Channel是指在发送数据时,如果Channel的缓冲区未满,则发送方不会被阻塞。同样地,在接收数据时,如果Channel的缓冲区非空,则接收方不会被阻塞。缓冲Channel的代码示例如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 1) // 创建一个容量为1的缓冲Channel

    go func() {
        time.Sleep(time.Second)
        ch <- 1 // 发送数据到Channel
        fmt.Println("数据已发送")
    }()

    fmt.Println("等待数据中...")
    time.Sleep(2 * time.Second) // 等待一段时间,确保Goroutine有足够的时间发送数据
    data := <-ch                // 接收Channel中的数据
    fmt.Println("接收到数据:", data)
}

在这个例子中,我们创建了一个容量为1的缓冲Channel ch

Le canal non tamponné est un bon choix lorsque nous devons garantir l'ordre d'envoi et de réception, ou lorsque nous devons synchroniser les opérations entre deux Goroutines.

    Buffered Channel

    Buffered Channel signifie que lors de l'envoi de données, si le tampon du canal n'est pas plein, l'expéditeur ne sera pas bloqué. De même, lors de la réception de données, si le buffer du Channel n'est pas vide, le récepteur ne sera pas bloqué. L'exemple de code de buffering Channel est le suivant :

    rrreee

    Dans cet exemple, nous créons un buffering Channel ch d'une capacité de 1. Dans le Goroutine anonyme, nous attendons 1 seconde puis envoyons les données 1 au Channel. Attendez un certain temps dans le Goroutine principal pour vous assurer que le Goroutine a suffisamment de temps pour envoyer les données, puis recevez les données et imprimez-les. En raison de l'utilisation d'un canal tamponné, l'opération d'envoi de données ne bloquera pas le Goroutine principal.

    Lorsque nous envoyons des données et que nous ne voulons pas que l'expéditeur soit bloqué, ou que nous voulons réduire le temps d'attente entre les Goroutines, la mise en mémoire tampon du canal est un bon choix.

    🎜Résumé : 🎜🎜Lorsque vous choisissez d'utiliser un canal avec ou sans tampon, vous pouvez juger selon que vous devez synchroniser les opérations Goroutine. Si vous devez garantir l'ordre d'envoi et de réception ou synchroniser les opérations entre deux Goroutines, vous pouvez choisir d'utiliser un canal non tamponné si vous ne souhaitez pas que l'expéditeur soit bloqué ou si vous souhaitez réduire le temps d'attente entre les Goroutines ; , vous pouvez choisir d'utiliser un canal mis en mémoire tampon. 🎜🎜Il convient de noter que lors de l'utilisation d'un canal non tamponné, l'expéditeur et le destinataire doivent être prêts en même temps, sinon un blocage se produira. Par conséquent, lors de l’utilisation de canaux non tamponnés, les problèmes de synchronisation entre les Goroutines doivent être soigneusement examinés. 🎜🎜En sélectionnant rationnellement les canaux tamponnés ou non, nous pouvons mieux utiliser les fonctionnalités de concurrence fournies par le langage Go pour obtenir une communication et une synchronisation efficaces entre les Goroutines. 🎜

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