Wie implementiert man einfache Schauspieler ohne Akka? Ich brauche keine hohe Leistung für viele (nicht feste Anzahl) Actor-Instanzen, Green-Threads, IoC (Lifecycle, Props-basierte Fabriken, ActorRef's), Überwachung, Gegendruck usw. Benötigt nur Sequentialität (Warteschlange) + Handler + Status + Nachrichtenübergabe
Als Nebeneffekt brauche ich eine kleine akteurbasierte Pipeline (mit rekursiven Links) und einige parallele Akteure, um den DSP akkaSystem
Warum nicht Akka
Akka ist schwer, was bedeutet:
jstack
/ jconsole
/ jvisualvm
zu debuggen, da ein Akteur auf einen beliebigen Thread reagieren kann. Sicher, Akkas Glas (1,9 MB) und Speicherverbrauch (2,5 Millionen Darsteller pro GB) sind überhaupt nicht schwer, so dass Sie es sogar auf Android ausführen können. Aber es ist auch bekannt, dass Sie spezialisierte Werkzeuge verwenden sollten, um Akteure (wie Typesafe Activator / Console) zu beobachten und zu analysieren, mit denen der Benutzer nicht vertraut ist (und ich würde sie nicht dazu bringen, es zu lernen). Es ist alles in Ordnung für Enterprise-Projekt, da es fast immer IoC, einige spezialisierte Tools und kontinuierliche Migration hat, aber das ist keine gute Ansatz für eine einfache Bibliothek.
P.S. Über Abhängigkeiten. Ich habe sie nicht und möchte auch keine hinzufügen (ich meide sogar den Scalaz, der hier eigentlich ein bisschen passt), da dies zu einer hohen Wartung führen wird - ich muss meine einfache Bibliothek behalten up-to-date mit Akka.
Hier ist der minimalste und effizienteste Schauspieler in der JVM-Welt mit API basierend auf Minimalist Scala von Viktor Klang: Zypern
Es ist praktisch und sicher in der Verwendung, aber es ist nicht typsicher beim Nachrichtenempfang und kann keine Nachrichten zwischen Prozessen oder Hosts senden.
Hauptmerkmale:
einfachste FSM-ähnliche API mit nur drei Zuständen ( Stay
, Become
und Die
): Ссылка
minimalistische Fehlerbehandlung - einfach passend zum Standard-Exception-Handler von Executor-Threads: Ссылка
schnelle asynchrone Initialisierung, die ~ 200 ns benötigt, um abgeschlossen zu werden, so dass keine zusätzlichen Futures / Aktoren für zeitaufwendige Aktor-Initialisierung benötigt werden: Ссылка
kleinster Speicherbedarf, dh ~ 40 Bytes in passivem Zustand (BT% new String()
gibt die gleiche Menge an Bytes im JVM-Heap aus): Ссылка
sehr effizient in der Nachrichtenverarbeitung mit Durchsatz ~ 90M msg / sec für 4-Kern-CPU: Ссылка
sehr effizient beim Senden / Empfangen von Nachrichten mit Latenz ~ 100 ns: Ссылка
pro Schauspieler Tuning der Fairness durch den Batch-Parameter: Ссылка
Beispiel für Stateful Counter:
%Vor%Ergebnisse:
%Vor%Dies wird FixedThreadPool (und damit seine interne Task-Warteschlange) verwenden:
%Vor%FixedThreadPool mit der Größe 1 garantiert hier die Sequentialität. Natürlich ist es nicht der beste Weg, um Ihre Threads zu verwalten, wenn Sie 100500 dynamisch erstellte Akteure benötigen, aber es ist in Ordnung, wenn Sie eine bestimmte Anzahl an Akteuren pro Anwendung benötigen, um Ihr Protokoll zu implementieren.
Verwendung:
%Vor%Ergebnisse:
%Vor%Diese Implementierung verwendet zwei Java-Threads und ist daher "doppelt" schneller als das Zählen ohne Parallelisierung.
Tags und Links scala concurrency akka actor