Maison  >  Article  >  développement back-end  >  Comment faire de la concurrence en langage Go

Comment faire de la concurrence en langage Go

青灯夜游
青灯夜游original
2023-01-18 14:19:011719parcourir

Le langage Go prend en charge les fonctionnalités de concurrence via le runtime du compilateur ; la concurrence est réalisée via goroutine. Goroutine est une implémentation très légère qui peut effectuer des milliers de tâches simultanées en un seul processus. Elle constitue le cœur de la conception simultanée du langage Go. Vous pouvez créer une goroutine à l'aide du mot-clé go, placer la déclaration go avant une fonction qui doit être appelée, puis appeler et exécuter la fonction dans le même espace d'adressage, afin que la fonction soit exécutée en tant que thread concurrent indépendant.

Comment faire de la concurrence en langage Go

L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.

La concurrence signifie que plusieurs tâches peuvent être exécutées en même temps. La programmation simultanée a une signification large, incluant la programmation multithread, la programmation multi-processus et les programmes distribués.

Le langage Go prend en charge les fonctionnalités de concurrence via le runtime du compilateur. La concurrence dans le langage Go est réalisée grâce à la fonctionnalité goroutine. Les goroutines sont similaires aux threads, mais plusieurs goroutines peuvent être créées pour fonctionner simultanément selon les besoins. Goroutine est planifié par le runtime du langage Go, tandis que les threads sont planifiés par le système d'exploitation.

Le langage Go fournit également des canaux pour communiquer entre plusieurs goroutines. Goroutine et Channel sont des bases de mise en œuvre importantes pour le modèle de concurrence CSP (Communicating Sequential Process) auquel adhère le langage Go.

Goroutine Introduction

goroutine est une implémentation très légère qui peut effectuer des milliers de tâches simultanées en un seul processus. C'est le cœur de la conception simultanée du langage Go.

En dernière analyse, la goroutine est en fait un thread, mais elle est plus petite qu'un thread. Une douzaine de goroutines peuvent être reflétées dans cinq ou six threads au niveau de la couche inférieure, et le langage Go implémente également le partage de mémoire entre les goroutines.

Utilisez le mot-clé go pour créer une goroutine, placez la déclaration go avant une fonction qui doit être appelée, puis appelez et exécutez cette fonction dans le même espace d'adressage, de sorte que lorsque la fonction est exécutée, elle agisse comme une fonction indépendante. thread concurrent. Ce type de thread sera en langage Go, on l'appelle goroutine.

goroutine est utilisé comme suit :

//go 关键字放在方法调用前新建一个 goroutine 并执行方法体
go GetThingDone(param1, param2);
//新建一个匿名方法并执行
go func(param1, param2) {
}(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块
go {
    //do someting...
}

Parce que goroutine est parallèle dans un environnement CPU multicœur, si le bloc de code est exécuté dans plusieurs goroutines, alors nous avons atteint le parallélisme de code.

Si vous avez besoin de connaître l'exécution du programme, comment obtenir les résultats parallèles ? Il doit être utilisé conjointement avec le canal.

channel

channel est la méthode de communication entre goroutines fournie par le langage Go au niveau du langage. Nous pouvons utiliser des canaux pour transmettre des messages entre deux ou plusieurs goroutines.

channel est une méthode de communication intra-processus, donc le processus de transmission d'objets via des canaux est cohérent avec le comportement de transmission des paramètres lors de l'appel de fonctions. Par exemple, des pointeurs peuvent également être transmis. Si une communication entre processus est requise, nous vous recommandons d'utiliser une approche de système distribué, par exemple en utilisant des protocoles de communication tels que Socket ou HTTP. Le langage Go dispose également d’un support très complet pour Internet.

Le canal est lié au type, c'est-à-dire qu'un canal ne peut transmettre qu'un seul type de valeur, et ce type doit être spécifié lors de la déclaration du canal. Si vous connaissez quelque chose sur les tubes Unix, il n'est pas difficile de comprendre le canal, qui peut être considéré comme un tube de type sécurisé.

Lors de la définition d'un canal, vous devez également définir le type de valeur envoyée au canal. Notez que vous devez utiliser make pour créer le canal. Le code est le suivant :

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

Retour aux temps anciens avant Windows et Linux. est apparu, lors du développement de programmes, il n'y a pas de concept de concurrence, car le langage de programmation impératif est basé sur la sérialisation. Le programme exécutera chaque instruction de manière séquentielle. L'ensemble du programme n'a qu'un seul contexte d'exécution, c'est-à-dire une pile d'appels et un tas.

La concurrence signifie que le programme a plusieurs contextes d'exécution au moment de l'exécution, correspondant à plusieurs piles d'appels. Nous savons que lorsque chaque processus est en cours d'exécution, il a sa propre pile d'appels et son propre tas, ainsi qu'un contexte complet. Lorsque le système d'exploitation planifie un processus, il enregistre le contexte du processus planifié une fois que le processus a obtenu la tranche de temps. restaurer le contexte du processus dans le système.

Du point de vue de l'ensemble du système d'exploitation, plusieurs processus peuvent être simultanés, alors quelle est la valeur de la concurrence ? Examinons d’abord les scénarios suivants.

1) D'une part, nous avons besoin d'une interface utilisateur graphique réactive. D'autre part, le programme doit également effectuer un grand nombre d'opérations ou d'opérations gourmandes en E/S, et nous devons faire en sorte que la réponse et les opérations de l'interface s'exécutent. en même temps.

2) Lorsque notre serveur Web est confronté à un grand nombre de demandes d'utilisateurs, davantage d'"unités de travail du serveur Web" sont nécessaires pour répondre respectivement aux utilisateurs.

3) Nos transactions se font dans un environnement distribué. La même unité de travail traite les données fragmentées sur différents ordinateurs. Le processeur de l'ordinateur évolue du monocœur au multicœur, et nos programmes sont en série, les capacités du matériel informatique ne sont pas utilisées.

4) Notre programme est bloqué en raison d'opérations IO, l'ensemble du programme est dans un état stagnant et d'autres tâches non liées aux IO ne peuvent pas être exécutées.

Comme vous pouvez le voir dans les exemples ci-dessus, les programmes en série ne peuvent pas répondre à nos exigences dans de nombreux scénarios. Ci-dessous, nous avons résumé plusieurs avantages des programmes simultanés pour faire comprendre à chacun que la concurrence est impérative :

  • La concurrence peut représenter le modèle de problème de manière plus objective

  • La concurrence peut exploiter pleinement les avantages du cœur du processeur et améliorer le fonctionnement du processeur. efficacité du programme Efficacité d'exécution ;

  • La concurrence peut exploiter pleinement l'asynchronie inhérente entre le processeur et les autres périphériques matériels.

【Recommandations associées : Tutoriel vidéo Go, Enseignement de la programmation

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