web-dev-qa-db-fra.com

Comment les chaînes Go sont-elles implémentées?

Après avoir (brièvement) passé en revue les spécifications de la langue Go, Go efficace et le modèle de mémoire Go, je ne sais toujours pas comment les canaux Go fonctionnent sous le capot.

De quel type de structure s'agit-il? Ils agissent un peu comme une file d'attente/tableau thread-safe.

Leur implémentation dépend-elle de l'architecture?

65
Matt

Le fichier source pour les canaux est (à partir de votre racine de code source go) dans / src/pkg/runtime/chan.go .

hchan est la structure de données centrale d'un canal, avec l'envoi et la réception de listes liées (contenant un pointeur vers leur goroutine et l'élément de données) et un indicateur closed. Il existe une structure incorporée Lock qui est définie dans runtime2.go et qui sert de mutex (futex) ou de sémaphore selon le système d'exploitation. L'implémentation de verrouillage se trouve dans lock_futex.go (Linux/Dragonfly/Some BSD) ou lock_sema.go (Windows/OSX/Plan9/Some BSD), basé sur les balises de build.

Les opérations de canal sont toutes implémentées dans ce fichier chan.go, vous pouvez donc voir les opérations makechan, envoyer et recevoir, ainsi que les constructions intégrées select, close, len et cap.

Pour une grande explication en profondeur sur le fonctionnement interne des canaux, vous devez lire Go canaux on steroids par Dmitry Vyukov lui-même (Go core dev, goroutines, scheduler and channels entre autres).

71
mna

Voici une bonne présentation qui décrit à peu près comment les canaux sont mis en œuvre:
https://youtu.be/KBZlN0izeiY

Description de la conférence:

GopherCon 2017: Kavya Joshi - Comprendre les canaux

Les canaux fournissent un mécanisme simple pour que les goroutins communiquent, et une construction puissante pour construire des modèles de concurrence sophistiqués. Nous explorerons le fonctionnement interne des canaux et les opérations sur les canaux, y compris la façon dont ils sont pris en charge par le planificateur d'exécution et les systèmes de gestion de la mémoire.

2
ayke