2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Les goroutines s'exécutent dans le même espace d'adressage, l'accès à la mémoire partagée doit donc être synchronisé.Les Goroutines partagent la mémoire via la communication, plutôt que de partager la mémoire.
Le canal de type référence est une implémentation spécifique du mode CSP et est utilisé pour la communication entre plusieurs goroutines. Il implémente la synchronisation en interne pour garantir la sécurité de la concurrence.
Comme map, channel est également une référence à la structure de données sous-jacente créée par make.
Lorsque nous copions un canal ou l'utilisons pour le passage de paramètres de fonction, nous copions simplement une référence de canal, de sorte que l'appelant et l'appelé référenceront le même objet de canal. Comme les autres types de référence, la valeur zéro du canal est nulle.
Lorsque vous définissez un canal, vous devez également définir le type de valeurs envoyées au canal. Les canaux peuvent être créés à l'aide de la fonction make() intégrée :
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
Par défaut, le canal se bloque lors de la réception et de l'envoi de données, à moins que l'autre extrémité ne soit prête, ce qui simplifie la synchronisation des goroutines sans avoir besoin de verrous explicites.
Un canal sans tampon est un canal qui n'a aucune capacité à enregistrer une valeur avant de la recevoir.
Ce type de canal nécessite que la goroutine d'envoi et la goroutine de réception soient prêtes en même temps à terminer les opérations d'envoi et de réception. Si deux goroutines ne sont pas prêtes en même temps, le canal provoquera le blocage et l'attente de la goroutine qui effectue l'opération d'envoi ou de réception en premier.
Cette interaction d'envoi et de réception sur le canal est intrinsèquement synchrone. Aucune opération ne peut exister indépendamment des autres.
La figure suivante montre comment deux goroutines peuvent partager une valeur en utilisant des canaux sans tampon :
make (chan Type)//等价于make (chan Type,0)
Si aucune taille de tampon n'est spécifiée, le canal est synchrone et se bloque donc jusqu'à ce que l'expéditeur soit prêt à envoyer et que le récepteur soit prêt à recevoir.
Un canal tamponné est un canal capable de stocker une ou plusieurs valeurs avant d'être reçu.
Ce type de canal ne nécessite pas que la goroutine termine l'envoi et la réception en même temps. Les canaux auront également des conditions différentes qui bloquent les actions d'envoi et de réception. L'action de réception ne bloquera que s'il n'y a aucune valeur dans le canal à recevoir. L'action d'envoi ne bloquera que si le canal n'a pas de tampon disponible pour accueillir la valeur envoyée.
Cela conduit à une grande différence entre les canaux tamponnés et non tamponnés : les canaux non tamponnés garantissent que les goroutines d'envoi et de réception échangeront des données en même temps : les canaux tamponnés n'ont pas une telle garantie.
make (chan Type,capacity)
Si une capacité tampon est donnée, le canal est asynchrone. Tant que le tampon dispose d'un espace inutilisé pour l'envoi de données ou contient des données pouvant être reçues, la communication se poursuit sans blocage.
Le canal peut utiliser ok pour détecter si le canal est toujours ouvert. Si le canal est fermé, les données ne seront pas lues.
num ,ok:=<-ch
Peut détecter si un canal est fermé.Par défaut, le canal est à double question, c'est-à-dire que vous pouvez lui envoyer des données et en recevoir.
Cependant, nous voyons souvent un canal passé en paramètre et la valeur est censée être utilisée dans un sens, soit uniquement pour envoyer des données, soit uniquement pour recevoir des données. À ce stade, nous pouvons spécifier la direction du canal. La déclaration d'une variable chamel unidirectionnelle est très simple, comme suit :
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan<- signifie que les données entrent dans le canal et que les données sont écrites dans le canal, qui est transmis à l'appelant.
<-chan indique que les données sortent du tube. Pour l'appelant, les données du tube sont obtenues, qui sont bien sûr l'entrée.
Un canal peut être implicitement converti en une file d'attente unidirectionnelle, recevant uniquement ou envoyant uniquement, mais un canal unidirectionnel ne peut pas être converti en un canal normal ;