Maison Problème commun Explications relatives aux chaînes en langage Go

Explications relatives aux chaînes en langage Go

Apr 09, 2019 am 11:41 AM
channel go语言

Le modèle CSP est utilisé dans le langage Go pour la communication des threads. Pour être précis, il s'agit d'une communication entre des goroutines de threads légers. Le modèle CSP est similaire au modèle Actor. Il est également composé d'entités indépendantes qui s'exécutent simultanément. Les entités communiquent également en envoyant des messages.

1. La différence entre le modèle d'acteur et le modèle CSP :

Les acteurs communiquent directement, tandis que CSP communique via Channel. sont les mêmes. Il y a une différence, ces derniers sont plus faiblement couplés.
La principale différence est que dans le modèle CSP, l'expéditeur et le destinataire du message sont faiblement couplés via Channel. L'expéditeur ne sait pas quel destinataire a consommé le message, et le destinataire ne sait pas quel expéditeur a envoyé le message. . Dans le modèle Acteur, puisque l'Acteur peut choisir quel message entrant traiter en fonction de son propre état, l'autonomie et la contrôlabilité sont meilleures.
Afin de ne pas bloquer le processus en langage Go, les programmeurs doivent vérifier les différents messages entrants afin de prévoir et s'assurer du bon ordre. L'avantage de CSP est que Channel n'a pas besoin de mettre les messages en mémoire tampon, tandis qu'Actor a théoriquement besoin d'une boîte aux lettres de taille illimitée comme tampon de messages.
L'expéditeur du message du modèle CSP ne peut envoyer un message que lorsque le destinataire est prêt à recevoir le message. En revanche, la transmission des messages dans le modèle Actor est asynchrone, c'est-à-dire que l'envoi et la réception des messages n'ont pas besoin de se produire en même temps, et l'expéditeur peut envoyer le message avant que le destinataire ne soit prêt à le recevoir.

2. Explication détaillée de Go Channel
Le format de définition du type de chaîne est le suivant :

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
Copier après la connexion

Il comprend trois types de définitions. Le <- facultatif représente la direction du canal. Si aucune direction n'est spécifiée, le canal est bidirectionnel et peut à la fois recevoir et envoyer des données.

chan T          // 可以接收和发送类型为 T 的数据
chan<- float64  // 只可以用来发送 float64 类型的数据
<-chan int      // 只可以用来接收 int 类型的数据
Copier après la connexion

< - Combinez toujours avec le type le plus à gauche en premier. (L'opérateur <- s'associe au canal le plus à gauche possible)

c := make(chan bool) //创建一个无缓冲的bool型Channel
c <- x        //向一个Channel发送一个值
<- c          //从一个Channel中接收一个值
x = <- c      //从Channel c接收一个值并将其存储到x中
x, ok = <- c  //从Channel接收一个值,如果channel关闭了或没有数据,那么ok将被置为false
Copier après la connexion

Par défaut, l'émetteur et le récepteur du canal se bloqueront jusqu'à ce que l'autre partie soit prête à envoyer ou à recevoir, ce qui rend le langage Go inutile. Verrous ou d'autres conditions soutiennent naturellement la concurrence.
Utilisez make pour initialiser le canal, et vous pouvez définir la capacité :

make(chan int, 100) #//创建一个有缓冲的int型Channel
Copier après la connexion

Capacité (capacité) représente le nombre maximum d'éléments que le canal peut accueillir et représente la taille du cache du canal .
Si la capacité n'est pas définie, ou si la capacité est définie sur 0, cela signifie que le canal n'a pas de cache.
Vous pouvez recevoir/envoyer des données depuis/vers un canal dans plusieurs goroutines sans avoir à envisager des mesures de synchronisation supplémentaires.
Le canal peut être utilisé comme une file d'attente premier entré, premier sorti (FIFO), et l'ordre des données reçues et des données envoyées est cohérent.
Le canal sans mise en mémoire tampon possède à la fois des caractéristiques de communication et de synchronisation et est très populaire dans le développement simultané.

// _Channels_ are the pipes that connect concurrent
// goroutines. You can send values into channels from one
// goroutine and receive those values into another
// goroutine.

package main

import "fmt"

func main() {

    // Create a new channel with `make(chan val-type)`.
    // Channels are typed by the values they convey.
    messages := make(chan string)

    // _Send_ a value into a channel using the `channel <-`
    // syntax. Here we send `"ping"`  to the `messages`
    // channel we made above, from a new goroutine.
    go func() { messages <- "ping" }()

    // The `<-channel` syntax _receives_ a value from the
    // channel. Here we&#39;ll receive the `"ping"` message
    // we sent above and print it out.
    msg := <-messages
    fmt.Println(msg)
}
Copier après la connexion

Ici, nous créons un canal de type chaîne sans tampon, puis transmettons "ping" à ce canal en utilisant canal<- dans une goroutine. <-Le canal reçoit cette valeur et l'imprime dans la fonction principale. En fait, nous utilisons ici Channel pour transférer tranquillement le message "ping" d'une goroutine vers la goroutine principale, réalisant ainsi la communication entre les threads (pour être précis, entre les goroutines).
Étant donné que l'émetteur et le récepteur du canal se bloqueront jusqu'à ce que l'autre partie soit prête à envoyer ou à recevoir, cela nous permet d'attendre le message "ping" à la fin du programme sans avoir besoin d'autres opérations de synchronisation.
Regardons un autre exemple : une fois que la goroutine définie par l'utilisateur a terminé une opération, elle rappelle la goroutine principale :

// We can use channels to synchronize execution// across goroutines. Here&#39;s an example of using a// blocking receive to wait for a goroutine to finish.package mainimport "fmt"import "time"// This is the function we&#39;ll run in a goroutine. The// `done` channel will be used to notify another// goroutine that this function&#39;s work is done.func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")    // Send a value to notify that we&#39;re done.
    done <- true}func main() {    // Start a worker goroutine, giving it the channel to
    // notify on.
    done := make(chan bool, 1)    go worker(done)    // Block until we receive a notification from the
    // worker on the channel.
    <-done
}
Copier après la connexion

                                                                                              🎜>

Le modèle CSP est utilisé dans le langage Go pour la communication par fil de discussion. . Pour être précis, il s'agit d'une communication entre des goroutines de threads légers. Le modèle CSP est similaire au modèle Actor. Il est également composé d'entités indépendantes qui s'exécutent simultanément. Les entités communiquent également en envoyant des messages. [Cours recommandé : Tutoriel vidéo Go]

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 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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Apr 02, 2025 pm 02:03 PM

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Apr 02, 2025 pm 12:57 PM

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Lorsque vous utilisez SQL.Open, pourquoi ne signale pas une erreur lorsque DSN passe vide? Lorsque vous utilisez SQL.Open, pourquoi ne signale pas une erreur lorsque DSN passe vide? Apr 02, 2025 pm 12:54 PM

Lorsque vous utilisez SQL.Open, pourquoi le DSN ne signale-t-il pas une erreur? En langue go, sql.open ...