Maison  >  Article  >  développement back-end  >  Golang implémente l'acteur

Golang implémente l'acteur

PHPz
PHPzoriginal
2023-05-16 10:29:071042parcourir

Ces dernières années, avec le développement continu d'Internet, des applications mobiles et de l'Internet des objets, l'informatique distribuée est devenue de plus en plus importante. Afin de mieux utiliser les ressources informatiques et les données existantes, des cadres informatiques distribués ont émergé. Parmi eux, le modèle Actor, en tant que modèle informatique distribué, a montré d'excellentes capacités dans la gestion des problèmes informatiques distribués et a donc reçu de plus en plus d'attention et de reconnaissance de la part des développeurs. Le langage GO est devenu un choix idéal pour la mise en œuvre du modèle Actor en raison de sa simplicité, de son efficacité, de sa sécurité et d'autres caractéristiques. Cet article présentera les principes et méthodes de base de mise en œuvre du modèle Actor en langage GO.

  1. Concept de base du modèle d'acteur

Actor a été proposé par Carl Hewitt en 1973 et est un modèle informatique distribué. Le modèle Actor est un modèle informatique qui résume les nœuds informatiques en individus, appelés acteurs. Chaque acteur est une entité exécutable composée d'états, de comportements et de capacités indépendants. Les acteurs communiquent entre eux en transmettant des messages de manière asynchrone. Étant donné que les acteurs communiquent de manière asynchrone, il n'est pas nécessaire de prendre en compte des problèmes tels que les conditions de concurrence et les verrous. Dans l'informatique distribuée, les acteurs sont indépendants les uns des autres et ne généreront pas de conditions de concurrence entre eux et auront une bonne évolutivité et évolutivité.

  1. Le principe d'implémentation du modèle Actor en langage Go

Le langage Go implémente la définition de groupe d'Acteurs du même type basée sur la méthode interface (interface{}), qui est similaire à la définition du protocole de message Actor. les instances sont transmises via des messages pour communiquer. L'interface basée sur les méthodes du langage Go implémente la prise en charge du modèle Actor. L'acteur appellera la fonction privée correspondante en fonction du type de message reçu pour modifier son propre état et son comportement.

La fonctionnalité Canaux du langage Go facilite la mise en œuvre du modèle Actor. Le mécanisme d'envoi et de réception de Channels et de Goroutine limite simultanément les limites de prise de décision et les parties critiques du programme, éliminant ainsi le besoin de mémoire partagée et de mécanismes de contrôle de verrouillage. Cela garantit que les acteurs n'ont pas eu de problèmes d'accès au verrouillage et à l'exclusion mutuelle auparavant, car ils ne peuvent utiliser que des canaux pour la transmission de messages, et le canal en langage Go est sans tampon et thread-safe une fois qu'un canal de tableau est initialisé, à l'intérieur lors du stockage des données. , aucune condition de course ne se produira entre plusieurs coroutines (acteurs). Par conséquent, la mise en œuvre du langage Go peut bien prendre en charge le modèle Actor et atteindre l’objectif de l’informatique distribuée.

  1. Parcours technique pour implémenter le modèle Actor en langage Go

Afin d'implémenter le modèle Actor, nous devons implémenter une structure ou une classe avec des caractéristiques Actor, y compris un canal interne pour recevoir des messages et une variable d'état privée pour l'enregistrement le statut d'Acteur.

Sur la base des principes ci-dessus, nous pouvons l'implémenter par étapes :

  1. Définir la classe de message

Afin d'interagir avec l'acteur, la classe de message doit définir un récepteur. Nous pouvons utiliser le type d'interface pour définir une structure de message :

type Message interface {

GetReceiver() Actor

}

2. Définir la classe Actor

Actor est un processus qui peut accepter des messages. La simple définition d'un acteur consiste à inclure l'entrée. canal et méthodes de traitement :

type Actor struct {

in chan Message

}

func NewActor() Actor {

a := Actor{in: make(chan Message, 1)}
go a.waitForMsg()
return a

}

func (a Actor)waitForMsg() {

for {
    msg := <-a.in
    msg.GetReceiver().HandleMsg(msg)
}

}

3. class

Maintenant, nous pouvons implémenter la méthode HandleMsg dans Actor. La méthode HandleMsg modifie le statut de l'Acteur en fonction du type de message reçu, puis exécute la logique, comme indiqué dans le code suivant :

type Message struct {

Request string
ResChan chan string

}
func (a Actor)HandleMsg(msg Message) {

switch msg.Request {
case "calculate":
    a.calculate(msg)
    break
}

}

func (a Actor)calculate(msg Message) {
// Un peu de traitement logique

var result string = "result"
msg.ResChan <- result

}

4. Exécuter le test d'acteur

Dans la méthode principale, nous initialisons deux acteurs a1 et a2. Ensuite, l'acteur a1 envoie un message de type Message à l'acteur a2. Enfin, l'acteur a2 reçoit le message et appelle la méthode calculate pour traiter le message et renvoyer le résultat.

func main() {

actor1 := NewActor()
actor2 := NewActor()

ch := make(chan string, 1)
msg := Message{Request: "calculate", ResChan: ch}

actor1.in <- msg

result := <- ch
fmt.Println("result = ", result)

}

Enfin, le programme affichera :

result = result

Le code ci-dessus montre une méthode simple d'implémentation d'Actor. Cette méthode est plus simple et peut instancier n'importe quel nombre d'acteurs et permettre une messagerie asynchrone et un calcul parallèle entre eux. Bien entendu, afin de parvenir à un modèle d’acteur plus flexible et plus robuste, nous pouvons continuer à nous développer et à évoluer.

  1. Avantages et inconvénients de la mise en œuvre du modèle Actor en langage Go

Avantages :

  1. Facile à utiliser et à comprendre

Le code utilisant le modèle Actor est souvent beaucoup plus simple que le code multithread traditionnel car il n'a pas besoin prendre en compte les verrous et les threads Pour des problèmes tels que les pools et les sémaphores, il vous suffit de prêter attention à la manière dont chaque acteur gère les messages.

  1. Très facile à optimiser

Lors de la lecture d'applications à forte charge, les performances du modèle Actor présentent généralement de très bons avantages. La raison en est qu'il exploite pleinement les caractéristiques du langage GO lui-même, réduit l'utilisation de verrous statiques et peut allouer et gérer dynamiquement la mémoire au moment de l'exécution.

  1. Problèmes informatiques distribués faciles à gérer

Le modèle Actor offre un bon support pour l'informatique distribuée. Limités par le mécanisme asynchrone de transmission des messages, les acteurs fonctionnent indépendamment les uns des autres sans conditions de concurrence. Ils ont une bonne évolutivité et une bonne évolutivité, et il est plus facile de mettre en œuvre l'informatique distribuée.

Inconvénients :

  1. En raison du nombre illimité de files d'attente de messages, cela peut entraîner une utilisation excessive de la mémoire

Dans le modèle Actor du langage Go, la communication des messages est implémentée via des canaux. Si le canal de message n'a pas de récepteurs, ils restent en mémoire. Pour atténuer ce problème, nous devons vérifier si chaque canal est obsolète et si le canal n'est pas utilisé, il doit être fermé à temps.

  1. Le code est moins lisible

Par rapport au modèle de programmation orienté objet traditionnel, le code du modèle Actor est moins lisible et difficile à comprendre. Quelqu'un qui comprend la logique métier du modèle Actor doit avoir une compréhension approfondie du modèle Actor.

  1. Résumé

Cet article présente la méthode d'implémentation du modèle Actor dans le langage GO, y compris la définition des classes de messages, les classes Actor, l'implémentation des classes Actor et l'exécution des tests Actor. Le modèle Actor constitue une excellente solution pour rendre l’informatique distribuée plus efficace et plus fiable. Bien que le modèle Actor puisse être plus difficile à comprendre que la programmation orientée objet traditionnelle dans certains cas, ses excellentes performances dans des scénarios à charge élevée ont été acceptées et reconnues par de plus en plus de développeurs.

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