web-dev-qa-db-fra.com

Modèle d'acteur - ce qu'il constitue exactement

Je fais du développement objectif-C/iOS et j'ai entendu plusieurs références au modèle Actor. Dans le livre de Big Nerd Ranch, il est écrit:

Un objet acteur est utilisé lorsque vous avez une longue tâche à exécuter et du code qui doit être exécuté une fois terminé. Ce type d'objet reçoit les informations dont il a besoin pour effectuer la tâche et les rappels à exécuter lorsque cette tâche est terminée. L'acteur s'exécute sur son propre thread sans aucune autre entrée et est détruit lorsqu'il est terminé.

L'acteur ici est utilisé en conjonction avec un appel réseau. Est-ce ainsi que l'acteur est principalement utilisé? Est-ce mutuellement exclusif ou complémentaire à la délégation? La définition de l'acteur semble TRÈS large et j'essaie de mieux comprendre ce que cela signifie. Est-il également possible d'avoir un acteur dans un environnement non OO?

46
timpone

Cette définition d'un acteur semble en fait un peu restrictive. Il ne gère certainement pas les acteurs de style Erlang (ou je crois les acteurs de style Scala). D'après mon expérience, un acteur est quelque chose qui:

  • Envoie et reçoit des messages (chaque acteur a une boîte aux lettres)
  • Ne partage aucune mémoire mutable avec d'autres acteurs
  • Est planifié en fonction des caprices de l'exécution. Un acteur pourrait se voir attribuer son propre thread, mais il est plus probable que plusieurs acteurs participent au multithreading coopératif dans un seul thread, ou même participent peut-être au multithreading préventif.

Mais fondamentalement, un acteur est un morceau de code libre qui peut recevoir des messages de son environnement et peut renvoyer des messages vers son environnement.

Les acteurs sont utilisés chaque fois que vous avez besoin de beaucoup (et de beaucoup) de petits processus dynamiques. La mise en réseau est un cas d'utilisation courant, car vous ne voulez pas allouer un thread entier à chaque connexion. Vous voulez quelque chose de plus léger, donc vous allouez un acteur à chaque connexion, puis planifiez les acteurs sur un plus petit pool de threads. Mais la mise en réseau n'est certainement pas la seule utilisation d'un acteur.

À Erlang, un acteur est une fonction. La fonction s'appelle probablement elle-même (c'est donc fondamentalement une boucle infinie), et elle a probablement un moyen propre de se terminer automatiquement (la boucle infinie a une condition de "rupture"). La boucle attend généralement un message du système, le traite, puis envoie des messages au reste du système. La bibliothèque Erlang OTP a quelques abstractions qui éliminent le besoin même d'écrire la boucle, donc un acteur OTP est implémenté comme un ensemble de rappels. De cette façon, un acteur OTP ressemble beaucoup à un objet.

60
Daniel Yankowsky