<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Proactor-Entwurfsmuster_%28Proactor_Pattern%29</id>
	<title>Proactor-Entwurfsmuster (Proactor Pattern) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Proactor-Entwurfsmuster_%28Proactor_Pattern%29"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Proactor-Entwurfsmuster_(Proactor_Pattern)&amp;action=history"/>
	<updated>2026-08-25T12:34:12Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=Proactor-Entwurfsmuster_(Proactor_Pattern)&amp;diff=80&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= Proactor-Entwurfsmuster (Proactor Pattern) =  Das &#039;&#039;&#039;Proactor-Entwurfsmuster&#039;&#039;&#039; ist ein &#039;&#039;&#039;Verhaltensmuster&#039;&#039;&#039; für &#039;&#039;&#039;asynchrone Systeme&#039;&#039;&#039;.   Es dient der effizienten Verarbeitung von I/O-Operationen, die vom Betriebssystem &#039;&#039;&#039;asynchron&#039;&#039;&#039; ausgeführt werden – im Gegensatz zum Reactor-Entwurfsmuster, das auf &#039;&#039;&#039;synchronen, nicht-blockierenden I/O&#039;&#039;&#039; basiert.  == Grundidee ==  Beim Proactor-Muster startet die Anwendung eine asynchrone Operation (…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Proactor-Entwurfsmuster_(Proactor_Pattern)&amp;diff=80&amp;oldid=prev"/>
		<updated>2025-10-30T11:37:31Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= Proactor-Entwurfsmuster (Proactor Pattern) =  Das &amp;#039;&amp;#039;&amp;#039;Proactor-Entwurfsmuster&amp;#039;&amp;#039;&amp;#039; ist ein &amp;#039;&amp;#039;&amp;#039;Verhaltensmuster&amp;#039;&amp;#039;&amp;#039; für &amp;#039;&amp;#039;&amp;#039;asynchrone Systeme&amp;#039;&amp;#039;&amp;#039;.   Es dient der effizienten Verarbeitung von I/O-Operationen, die vom Betriebssystem &amp;#039;&amp;#039;&amp;#039;asynchron&amp;#039;&amp;#039;&amp;#039; ausgeführt werden – im Gegensatz zum &lt;a href=&quot;/index.php?title=Reactor-Entwurfsmuster&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Reactor-Entwurfsmuster (Seite nicht vorhanden)&quot;&gt;Reactor-Entwurfsmuster&lt;/a&gt;, das auf &amp;#039;&amp;#039;&amp;#039;synchronen, nicht-blockierenden I/O&amp;#039;&amp;#039;&amp;#039; basiert.  == Grundidee ==  Beim Proactor-Muster startet die Anwendung eine asynchrone Operation (…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Proactor-Entwurfsmuster (Proactor Pattern) =&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Proactor-Entwurfsmuster&amp;#039;&amp;#039;&amp;#039; ist ein &amp;#039;&amp;#039;&amp;#039;Verhaltensmuster&amp;#039;&amp;#039;&amp;#039; für &amp;#039;&amp;#039;&amp;#039;asynchrone Systeme&amp;#039;&amp;#039;&amp;#039;.  &lt;br /&gt;
Es dient der effizienten Verarbeitung von I/O-Operationen, die vom Betriebssystem &amp;#039;&amp;#039;&amp;#039;asynchron&amp;#039;&amp;#039;&amp;#039; ausgeführt werden – im Gegensatz zum [[Reactor-Entwurfsmuster]], das auf &amp;#039;&amp;#039;&amp;#039;synchronen, nicht-blockierenden I/O&amp;#039;&amp;#039;&amp;#039; basiert.&lt;br /&gt;
&lt;br /&gt;
== Grundidee ==&lt;br /&gt;
&lt;br /&gt;
Beim Proactor-Muster startet die Anwendung eine asynchrone Operation (z. B. Lesen oder Schreiben auf einem Socket) und übergibt eine &amp;#039;&amp;#039;&amp;#039;Completion Handler&amp;#039;&amp;#039;&amp;#039;-Funktion.  &lt;br /&gt;
Sobald die Operation abgeschlossen ist, meldet das Betriebssystem (oder eine I/O-Bibliothek) das Ergebnis zurück, und der Proactor ruft den entsprechenden Handler auf.&lt;br /&gt;
&lt;br /&gt;
Damit verschiebt sich die Verantwortung:&lt;br /&gt;
* Der Reactor reagiert auf **Ereignisse** („es gibt Daten“)&lt;br /&gt;
* Der Proactor reagiert auf **Fertigstellungen** („die Daten wurden gelesen“)&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Komponente !! Aufgabe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Asynchronous Operation Processor&amp;#039;&amp;#039;&amp;#039; || Führt die I/O-Operationen im Hintergrund aus (z. B. Betriebssystem)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Proactor&amp;#039;&amp;#039;&amp;#039; || Empfängt Fertigstellungsbenachrichtigungen und ruft den passenden Completion Handler auf&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Completion Handler&amp;#039;&amp;#039;&amp;#039; || Wird nach Abschluss einer Operation aufgerufen, um das Ergebnis zu verarbeiten&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Asynchronous Operation&amp;#039;&amp;#039;&amp;#039; || Repräsentiert eine gestartete I/O-Operation (z. B. async_read)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Initiator&amp;#039;&amp;#039;&amp;#039; || Startet asynchrone Operationen und registriert die Completion Handler&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ablaufdiagramm ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-----------------------+&lt;br /&gt;
|       Initiator       |&lt;br /&gt;
+-----------+-----------+&lt;br /&gt;
            |&lt;br /&gt;
            v&lt;br /&gt;
     [Start async I/O]&lt;br /&gt;
            |&lt;br /&gt;
            v&lt;br /&gt;
+-----------------------+&lt;br /&gt;
| Asynchronous Processor|&lt;br /&gt;
| (z. B. OS, IOCP)      |&lt;br /&gt;
+-----------+-----------+&lt;br /&gt;
            |&lt;br /&gt;
            v&lt;br /&gt;
 [Operation abgeschlossen]&lt;br /&gt;
            |&lt;br /&gt;
            v&lt;br /&gt;
+-----------------------+&lt;br /&gt;
|       Proactor        |&lt;br /&gt;
|  ruft CompletionHandler|&lt;br /&gt;
+-----------+-----------+&lt;br /&gt;
            |&lt;br /&gt;
            v&lt;br /&gt;
+-----------------------+&lt;br /&gt;
|  Completion Handler   |&lt;br /&gt;
+-----------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Pseudo-C++) ==&lt;br /&gt;
Ein vereinfachtes Beispiel für asynchrone Leseoperationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Pseudocode für asynchrone Dateioperationen&lt;br /&gt;
&lt;br /&gt;
void onReadComplete(const char* data, size_t bytesRead) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Daten empfangen: &amp;quot; &amp;lt;&amp;lt; std::string(data, bytesRead) &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startAsyncRead(int fd) {&lt;br /&gt;
    AsyncRead(fd, buffer, sizeof(buffer), onReadComplete);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int fd = open(&amp;quot;data.txt&amp;quot;, O_RDONLY);&lt;br /&gt;
    startAsyncRead(fd);&lt;br /&gt;
&lt;br /&gt;
    // Event loop wartet auf asynchrone Fertigstellungen&lt;br /&gt;
    Proactor::run();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ruft das Programm nicht selbst &amp;lt;code&amp;gt;read()&amp;lt;/code&amp;gt; auf, sondern startet eine asynchrone Operation.  &lt;br /&gt;
Sobald das Betriebssystem die Operation beendet hat, wird &amp;lt;code&amp;gt;onReadComplete()&amp;lt;/code&amp;gt; automatisch aufgerufen.&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zum Reactor-Muster ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Reactor !! Proactor&lt;br /&gt;
|-&lt;br /&gt;
| Ereignisart || Reagiert auf Ereignisse (z. B. &amp;quot;Socket ist lesbar&amp;quot;) || Reagiert auf abgeschlossene Operationen (&amp;quot;Lesen beendet&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| I/O-Typ || Nicht-blockierendes, synchrones I/O || Echte asynchrone I/O (durch OS)&lt;br /&gt;
|-&lt;br /&gt;
| Steuerung || Anwendung fragt aktiv nach Ereignissen || Betriebssystem benachrichtigt nach Abschluss&lt;br /&gt;
|-&lt;br /&gt;
| Beispielsysteme || &amp;lt;code&amp;gt;select()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;epoll()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;poll()&amp;lt;/code&amp;gt; || Windows I/O Completion Ports (IOCP), POSIX AIO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
* Hohe Effizienz bei asynchronem I/O  &lt;br /&gt;
* Weniger Blockierung und Kontextwechsel  &lt;br /&gt;
* Gute Skalierbarkeit bei vielen parallelen Operationen  &lt;br /&gt;
&lt;br /&gt;
== Nachteile ==&lt;br /&gt;
* Komplexer zu implementieren  &lt;br /&gt;
* Betriebssystemabhängig (unter Linux eingeschränkt, unter Windows durch IOCP gut unterstützt)  &lt;br /&gt;
* Schwerer zu debuggen  &lt;br /&gt;
&lt;br /&gt;
== Beispielhafte Verwendung ==&lt;br /&gt;
* Hochperformante Netzwerkserver (z. B. Webserver, Game-Server)  &lt;br /&gt;
* Asynchrone Dateiverarbeitung  &lt;br /&gt;
* Frameworks wie:&lt;br /&gt;
  * Boost.Asio (C++) – abstrahiert Reactor und Proactor&lt;br /&gt;
  * Windows IOCP (C/C++)  &lt;br /&gt;
  * .NET Async/Await (C#)  &lt;br /&gt;
&lt;br /&gt;
== Vergleich: Reactor vs. Proactor ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Reactor:  &amp;quot;Es gibt etwas zu tun&amp;quot;   → Anwendung reagiert&lt;br /&gt;
Proactor: &amp;quot;Es wurde etwas getan&amp;quot;   → Anwendung wird benachrichtigt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Reactor-Entwurfsmuster]]&lt;br /&gt;
* [[Asynchrone Ein-/Ausgabe]]&lt;br /&gt;
* [[Event-Driven Architecture]]&lt;br /&gt;
* [[Boost.Asio]]&lt;br /&gt;
* [[IOCP (Windows)]]&lt;br /&gt;
* [[Observer-Entwurfsmuster]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
* Douglas C. Schmidt: *Proactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Asynchronous Events*  &lt;br /&gt;
* POSA2 – *Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects*  &lt;br /&gt;
* [https://en.wikipedia.org/wiki/Proactor_pattern Wikipedia: Proactor Pattern]  &lt;br /&gt;
* [https://think-async.com/Boost.Asio/ Boost.Asio Dokumentation]&lt;/div&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
</feed>