Das Aktormodell arbeitet mit Nachrichtenübergabe. Einzelne Prozesse (Aktoren) dürfen Nachrichten asynchron miteinander versenden. Was unterscheidet dies von dem, was wir normalerweise als das Threading-Modell denken, ist, dass es (zumindest theoretisch) keinen gemeinsamen Zustand gibt. Und wenn man glaubt (zu Recht, denke ich), dass der gemeinsame Staat die Wurzel allen Übels ist, dann wird das Modell des Akteurs sehr attraktiv.
Wir sollten jedoch nicht über aufgeregt werden. Das Akteurmodell macht es (entgegen einigen Behauptungen) unmöglich, Deadlocks zu haben. Das Aktormodell verhindert auch nicht, dass Sie Konflikte zwischen verschiedenen Prozessen haben - z. B. Nachrichtenwarteschlangen. Das Modell ist nur oberhalb eines bestimmten Niveaus "frei von Sperren". Auf einer niedrigeren Ebene ist zum Koordinieren von Nachrichtenwarteschlangen das Sperren weiterhin erforderlich.
Kann ein Thread nicht als Akteur gesehen werden und Nachrichten an andere Threads senden?
Nun, ja und nein. Nein, wenn Sie nur den Ansatz verwenden, Mutexe um geteilte Speicherorte zu setzen. Dann teilen die Threads diesen Zustand - beide haben Zugriff auf diesen Speicher, können ihn lesen, neu schreiben usw. Aber Sie können ein Actor-Modell über einem Threading-Modell erstellen, und tatsächlich haben alle Actor-Implementierungen Threads unterhalb. Ich habe so etwas (sehr schlecht) zusammengehackt, indem ich jedem Thread eine Warteschlange beschert habe, die von einem Mutex bewacht wird - nur zum Spaß. Eine Vorstellung davon, wie die Impedanz des Aktor-Threads verwaltet wird, finden Sie unter my question from a year ago.
Kann ich das Actor Model in einer beliebigen Sprache verwenden, indem Sie Threads anders verwenden?
Ja, aber es wird ein bisschen mehr Arbeit brauchen. Ihre Lieblingssprache könnte eine Message-Passing-Bibliothek haben, also wäre das die erste Sache, die untersucht wird. Außerdem sollten Sie die Verwendung unveränderlicher Datenstrukturen untersuchen. Beachten Sie, dass, wenn eine Datenstruktur unveränderlich ist, Sie sich im Wesentlichen mit dem "Shared-State" -Problem befasst haben - mehrere Threads können Verweise auf unveränderliche Daten enthalten, ohne dass irgendetwas Schlimmes passiert. Es gibt einen Grund, warum Schauspielersprachen auch funktionale Sprachen sind (Erlang, Scala).
Sie können auch einen Blick auf den Software Transactional Memory werfen, der ein anderes, aber auch überzeugendes Modell darstellt. Clojure ist mein Lieblingsbeispiel dafür.
Je mehr I verwenden asynchrone Nachricht basierend concurrency Modelle Passing (z.B. Schauspieler oder Async/erwarten), je mehr ich sie von der alten, nur dual sind Standard synchronisiert blockiert concurrency Modell. Die asynchrone Nachrichtenübergabe ist nicht einfacher oder schwieriger als die Verwendung von Sperren und Monitoren.In der Tat gibt es keinen gemeinsamen veränderbaren Zustand, sondern nur auf der Ebene * einzelner Akteure *. Aber ein Akteur hat immer noch einen veränderlichen Zustand, und er ist tatsächlich von allen Akteuren wahrnehmbar, die damit kooperieren. Daher können Sie alle die gleichen Probleme haben: Deadlocks, Livelocks, Hungersnot, Race Conditions, etc. –