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.
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é.
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.
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 :
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.
Avantages :
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.
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.
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 :
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.
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.
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!