Einfache Erklärung für das „Reaktormuster“ mit seinen Anwendungen [geschlossen]

86

Das Reaktormuster wird in Wikipedia erklärt und ist etwas zu abstrakt. Können Sie dieses Muster konkreter beschreiben? Idealerweise mit Codefragmenten oder Klassendiagrammen auf hoher Ebene, die einige Anwendungen des Reaktormusters beschreiben.

Eleco
quelle
3
Ich
Ryan Gibbons

Antworten:

37

Vielleicht möchten Sie das Originalpapier überprüfen, das es beschreibt: http://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf

Das Reactor-Entwurfsmuster verarbeitet Serviceanforderungen, die von einem oder mehreren Clients gleichzeitig an eine Anwendung gesendet werden. Jeder Dienst in einer Anwendung kann aus mehreren Methoden bestehen und wird durch einen separaten Ereignishandler dargestellt, der für das Versenden von dienstspezifischen Anforderungen verantwortlich ist. Das Dispatching von Ereignishandlern wird von einem Initiierungs-Dispatcher durchgeführt, der die registrierten Ereignishandler verwaltet. Das Demultiplexen von Dienstanforderungen wird von einem synchronen Ereignisdemultiplexer durchgeführt.

reese
quelle
Wie Sie beim Lesen des Artikels feststellen werden, haben Douglas Schmidt et al. Ein hocheffizientes und modulares C ++ - Framework namens The Adaptive Communications Environment implementiert, bei dem das Reaktormuster eine zentrale Rolle spielt. Das Framework selbst nutzt eine Vielzahl von Designmustern und ist allein deshalb eine Prüfung wert. Wenn Sie nach einem portablen Framework zum Erstellen hochskalierbarer C ++ - Backends suchen, sollten Sie sich ACE ansehen.
user2015735
1
@reese Link ist heute Mann gebrochen :(
Allan Chua
1
@AllanChua Ich glaube, ich habe es gefunden - dre.vanderbilt.edu/~schmidt/PDF/Reactor.pdf
sergeyrar
2
OP bat um eine "einfache, konkrete" Erklärung, und Sie boten etwas an, das noch abstrakter ist als Wikipedia ...
Zhe
21

Ein Reaktor ermöglicht die effiziente Verarbeitung mehrerer Aufgaben, die blockieren (z. B. aufgrund von E / A), mit einem einzigen Thread. Der Reaktor verwaltet einen Pool von Handlern und führt eine Ereignisschleife aus. Wenn es aufgerufen wird, eine Aufgabe auszuführen, verknüpft es sie mit einem neuen oder freien Handler, wodurch es aktiviert wird. Die Ereignisschleife (1) findet alle Handler, die aktiv und nicht blockiert sind (oder delegiert dies an eine Dispatcher-Implementierung). (2) führt jeden dieser gefundenen Handler nacheinander aus, bis sie entweder abgeschlossen sind oder einen Punkt erreichen, an dem sie blockieren. Abgeschlossene Handler werden inaktiv und können nicht mehr verwendet werden, während blockierte aktive Handler nachgeben, sodass die Ereignisschleife fortgesetzt werden kann. (3) Wiederholungen von Schritt (1)

Andrew Pate
quelle
1
Downvote, weil dies nicht korrekt ist
SebNag
1
Die Kernidee besteht darin, synchrones Ereignis-Demultiplexing durchzuführen. Die Ereignishandler werden nur aufgerufen, wenn sie nicht blockierend ausgeführt werden können, z. B. wenn das gesamte Datenpaket an einem Netzwerksocket verfügbar ist und darauf wartet, dass ein Ereignishandler die Daten verarbeitet. Dies ermöglicht es, den Event-Handler sequentiell und nicht blockierend
auszuführen
1
"Das Reaktormuster ist für das Demultiplexen und Versenden mehrerer Ereignishandler verantwortlich, die ausgelöst werden, wenn es möglich ist, eine Operation synchron ohne Blockierung zu starten." aus dem Papier in der akzeptierten Antwort
SebNag
Dies ist überhaupt nicht wahr. In einem Nichtreaktor befinden sich so viele Fäden wie in einem Reaktormuster. Anstelle einer Ereignisschleife können Sie einen einzelnen "treibenden" Thread verwenden, der das Beobachter- / Ereignis-Listener-Muster nicht verwendet. Gleiche Leistung.
Zombies