Wie funktionieren Schauspieler im Vergleich zu Threads?

87

Gibt es eine gute und kurze Erklärung dafür, wie Schauspieler im Vergleich zu Threads funktionieren?

Kann ein Thread nicht als Schauspieler gesehen werden und Nachrichten an andere Threads senden? Ich sehe einen Unterschied, aber für mich ist das nicht so klar. Kann ich Schauspieler in jeder Sprache verwenden, indem ich Threads anders verwende?

Jonas
quelle

Antworten:

77

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.

Rob Lachlan
quelle
3
Je häufiger ich auf asynchroner Nachrichtenübermittlung basierende Parallelitätsmodelle verwende (z. B. Akteure oder asynchron / warten), desto mehr denke ich, dass sie nur doppelt so hoch sind wie das alte Standardmodell für synchronisierte blockierende Parallelität. Die asynchrone Nachrichtenübermittlung ist nicht einfacher oder schwieriger als die Verwendung von Sperren und Monitoren. In der Tat gibt es keinen gemeinsamen veränderlichen Zustand, sondern nur auf der Ebene der einzelnen Akteure . Aber ein Schauspieler hat immer noch einen veränderlichen Zustand, und er kann tatsächlich von allen Akteuren beobachtet werden, die mit ihm zusammenarbeiten. Daher können Sie die gleichen Probleme haben: Deadlocks, Livelocks, Hunger, Rennbedingungen usw.
Piotr Kołaczkowski
2

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

Bill la Forge
quelle
2
Das Akteurmodell wird nur durch asynchrone Kommunikation definiert ( en.wikipedia.org/wiki/Actor_model ). Wenn JActor das nicht tut, ist es nicht zu 100% nur das Schauspielermodell. Es kann einfach das Akteurmodell als eines von vielen seiner Merkmale verwenden.
BT