Das Akteurmodell arbeitet mit der Nachrichtenübermittlung. Einzelne Prozesse (Akteure) dürfen asynchron Nachrichten aneinander senden. Was dies von dem unterscheidet, was wir normalerweise als Threading-Modell betrachten, ist, dass es (zumindest theoretisch) keinen gemeinsamen Zustand gibt. Und wenn man (zu Recht, glaube ich) glaubt, dass der gemeinsame Zustand die Wurzel allen Übels ist, dann wird das Schauspielermodell sehr attraktiv.
Wir sollten jedoch nicht übermäßig aufgeregt sein. Das Schauspielermodell macht es (entgegen einiger Behauptungen) nicht unmöglich, Deadlocks zu haben. Das Akteurmodell verhindert auch nicht, dass Sie um Ressourcen zwischen verschiedenen Prozessen kämpfen - beispielsweise mit Nachrichtenwarteschlangen. Das Modell ist nur ab einem bestimmten Niveau "sperrenfrei". Auf einer niedrigeren Ebene ist zum Koordinieren von Nachrichtenwarteschlangen weiterhin eine Sperrung erforderlich.
Kann ein Thread nicht als Schauspieler gesehen werden und Nachrichten an andere Threads senden?
Ja und nein. Nein, wenn Sie nur den Ansatz verwenden, Mutexe um gemeinsam genutzte Speicherorte zu setzen. Dann teilen sich die Threads diesen Status - beide haben Zugriff auf diesen Speicher, können ihn lesen, neu schreiben usw. Sie können jedoch ein Akteurmodell auf einem Threading-Modell aufbauen, und tatsächlich haben alle Akteurimplementierungen Threads unterhalb. Ich habe so etwas (sehr schlecht) gehackt, indem ich jedem Thread eine Warteschlange gegeben habe, die von einem Mutex geschützt wird - nur zum Spaß. Um eine Vorstellung davon zu bekommen, wie die Impedanz zwischen Schauspieler und Thread verwaltet wird, lesen Sie meine Frage von vor einem Jahr .
Kann ich das Actor Model in einer beliebigen Sprache verwenden, indem ich Threads anders verwende?
Ja, aber es wird ein bisschen mehr Arbeit kosten. Ihre Lieblingssprache verfügt möglicherweise über eine Bibliothek zum Weiterleiten von Nachrichten. Dies ist also das erste, was untersucht werden muss. Außerdem sollten Sie die Verwendung unveränderlicher Datenstrukturen untersuchen. Beachten Sie, dass Sie sich, wenn eine Datenstruktur unveränderlich ist, im Wesentlichen mit dem Problem des "gemeinsam genutzten Status" befasst haben - mehrere Threads können Verweise auf unveränderliche Daten enthalten, ohne dass etwas Schlimmes passiert. Es gibt einen Grund, warum Schauspielersprachen in der Regel auch funktionale Sprachen sind (erlang, scala).
Vielleicht möchten Sie auch einen Blick auf Software Transactional Memory werfen, ein anderes, aber auch überzeugendes Modell. Clojure ist mein Lieblingsbeispiel dafür.
Ich würde nicht sagen, dass Schauspieler Nachrichten immer asynchron weitergeben - das wäre zu langsam. In diesem Fall verwendet das JActor-Projekt bidirektionale Nachrichten (Anforderung / Antwort), um einen Methodenaufruf besser zu modellieren. Und die meisten Anfragen werden synchron bearbeitet.
JActor (eine Java-Bibliothek) verwendet ebenfalls keine Sperren. Nur einige atomare und gleichzeitige Datenstrukturen mit ein paar eingeworfenen Semaphoren. Die Nachrichtenübermittlung beträgt etwa 0,8 Milliarden Nachrichten pro Sekunde.
https://github.com/laforge49/JActor
quelle