ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/docs/pws2006/event.pod
Revision: 1.10
Committed: Mon Jan 16 16:05:05 2006 UTC (20 years, 8 months ago) by root
Branch: MAIN
Changes since 1.9: +71 -71 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 Ereignisgesteuerte Programmierung mit Perl - die Realität
2    
3     =head2 Zusammenfassung
4    
5     Ereignisgesteuerte Programmierung ist hinreichend bekannt. Trotzdem
6     wird sie relativ selten benutzt - in Modulen so gut wie garnicht. Ich
7     möchte hier verschiedene Arten der Ereignissteuerung sauber von anderen
8 root 1.10 Formen der Programmierung trennen, vorhandene Ereignismodule und ihre
9 root 1.1 Unterschiede vorstellen. Vor allem sollen Möglichkeiten gezeigt werden,
10     wie man als Modulautor - je nach gewünschtem Aufwand - verschiedene APIs
11     anbieten kann.
12    
13 root 1.2
14     =head1 Ereignissteuerung - In aller Kürze
15    
16     Ereignissteuerung ist - für mich - kein sehr exakt festgelegter Begriff
17     oder eine festgelegte Syntax. Daher will ich einige Beispiele für
18     verschiedene Arten bzw. Grade der Ereignissteuerung, wie sie in der Praxis
19 root 1.10 vorkommen, vorstellen.
20 root 1.2
21     Üblicherweise verwendet man Ereignissteuerung immer dann, wenn man
22     genügend Rechenzeit für die Verarbeitung vieler Aufgaben hat, jedoch durch
23     externe Umstände (I/O-Geschwindigkeit, Netzwerk, User klickt nicht schnell
24     genug :) gezwungen ist, auf Daten bzw. Ereignisse zu warten.
25    
26     Ereignissteuerung bedeutet dann, ein Programm derart zu strukturieren,
27     daß es auf Ereignisse wartet und - möglichst schnell - reagiert. Die
28     Haupt-Eingabe besteht sozusagen in einem Strom von Ereignissen
29 root 1.4 (Event-Stream). Das Ziel der Ereignissteuerung ist es, die Gesamtdauer
30     aller Operationen zu verringern und die Reaktionsgeschwindigkeit zu
31     erhöhen.
32 root 1.2
33 root 1.10 Unter Unix gibt es eine zentrale Funktion, mit der ein Programm auf
34 root 1.2 Ereignisse warten kann: C<select> (bzw. auch C<pselect>/C<poll>, die sich
35     aber nicht von C<select> unterscheiden, sowie kompliziertere Methoden wie
36     realtime-Signale, die aber alle auf dasselbe hinauslaufen). C<select> kann
37     auf einen Timeout und auf die Möglichkeit, auf einen Filehandle schreiben
38     oder davon lesen zu können, warten. Dies reicht für alles aus, da unter
39     Unix "alles ein Dateihandle ist" (und wenn dies einmal nicht der Fall ist,
40     ist das gleich ein major pain in the ass und man tut gut daran, es auf
41     einen Dateihandle abzubilden).
42    
43     Daher ist eine derartige Programmstruktur meist eine zentrale Schleife,
44     in der auf Ereignisse (definiert durch "Watcher") gewartet wird und
45     dann Funktionen aufgerufen werden, um auf diese Ereignisse zu reagieren
46     ("Callbacks"). Da C<select> etwas low-level ist, gibt es Bibliotheken
47     und Module, die diese Funktionalität in eine freundlichere Schnittstelle
48     gießen - das nennt man dan "Event-Modell".
49    
50     Daraus folgt, daß das "Hauptprogramm" der Aufruf dieser Schleife/dieses
51     Event-Modells ist, und alle Ereignisse in Unterfunktionen behandelt werden
52 root 1.3 müssen. Daher lassen sich in einem Programm auch sehr schwer mehrere
53 root 1.2 Event-Modelle miteinander mischen, da nur jeweils eines die Kontrolle über
54     den Programmablauf haben kann.
55    
56    
57 root 1.3 =head1 Formen der Ereignissteuerung
58 root 1.1
59 root 1.10 =head2 Linearer Ablauf - "Nicht ereignisgesteuert"
60 root 1.3
61     Wir alle kennen (hoffe ich) LWP, mit dem man sehr einfach Webseiten u.ä.
62     abrufen kann:
63    
64     use LWP::Simple;
65     print get "http://www.cpan.org/";
66    
67     Ein heutiger Rechner kann das in Millisekunden erledigen - wenn es länger
68 root 1.10 dauert, liegt es nicht am eigenen Rechner sondern am Netz. LWP arbeitet
69 root 1.3 intern nämlich folgendermaßen:
70    
71     $socket = new IO::Socket ...;
72     print $socket $request;
73     $response = read $socket;
74     return $response;
75    
76 root 1.10 Die Wartezeit entsteht vor allem beim Lesen der Antwort, zu kleineren
77 root 1.3 Teilen beim Verbindungsaufbau und selten beim Schreiben der Anforderung.
78    
79     Prinzipiell gibt es auch hier eine Folge von Ereignissen, auf die gewartet
80     wird - allerdings immer nur eines, d.h. die Ereignisse "steuern" den
81     Programmablauf nicht. Daher ist dies keine Ereignissteuerung.
82    
83     Der Vorteil einer solchen Struktur ist ihre Einfachheit - die zeitliche
84     und logische Abfolge des Requests stehen klar hintereinander.
85    
86     Diese Einfachheit läßt sich auch ereignisgesteuert erreichen - allerdings
87     mit beträchtlichem Mehraufwand an anderer Stelle, den man jedoch gut in
88     andere Module verpacken kann.
89 root 1.1
90 root 1.10 =head3 blocking vs. "blocking"
91 root 1.1
92 root 1.3 Ein paar Worte noch zu blocking vs. non-blocking, bzw. blocking vs.
93     andere Arten von blocking: Unter Unix kann man Filehandles in den
94     "non-blocking"-Zustand versetzen. Dies ist manchmal hilfreich, hat aber
95     mit Ereignissteuerung wenig zu tun: Zum Lesen von Sockets braucht man
96     dies nicht, und bei Dateien zeigt es keine Wirkung (es wirkt nur auf
97     Dateihandles, bei denen die Menge an Daten unbekannt ist). In vielen
98     Fällen ist es sogar hinderlich.
99    
100     So ist es bei vielen Protokollen (whois, finger, viele HTTP-Anfragen)
101     fast sicher, daß die Anfrage komplett in den TCP-Buffer geschrieben
102     werden kann. Passt er nicht, blockiert der Prozess, aber wenn dies
103     unter normalen Umständen nicht vorkommt, ist dies meistens akzeptabler
104     als die Programmstruktur nur für diesen zu verkomplizieren, wie dies
105     bei einem non-blocking Dateihandle nötig wäre (leider erzeugt das
106     C<IO::Socket>-Modul alle Socket-Handles per default non-blocking, was
107     meiner Meinung nach mehr Probleme schafft als löst).
108    
109 root 1.4 In diesem Dokument wird der Begriff "blockierend" nicht als synonym zu
110     diesem C<O_NONBLOCK> gebraucht, sondern allgemein verwendet, um jeglichen
111 root 1.10 Aufruf zu beschreiben, der nicht so schnell wie möglich zurückkehrt. Dies
112     schließt nicht nur Dinge wie das Lesen von Sockets, wenn keine Daten vorhanden
113     sind, oder sleep-ähnliche Aufrufe ein, sondern auch Dinge wie das Lesen
114 root 1.4 von einer Datei auf der Festplatte oder von NFS, wenn die Daten nicht im
115     RAM sind.
116    
117 root 1.3 =head2 State-Maschinen
118    
119     Um nun auf Ereignisse in beliebiger Folge reagieren zu können, muss man
120     jedes Ereignis ("Verbindung aufgebaut", "Daten können geschrieben werden",
121     "Daten können gelesen werden") in einer Unterroutine abarbeiten.
122    
123     Bei Frameworks wie POE werden alle diese Unterroutinen als Methoden eines
124     Objektes aufgefasst. Das Objekt speichert den Zustand (z.B. "Aufbauphase",
125     "Antwortphase"). Bei jedem Ereignis muss der Zustand aus dem Objekt
126     "deserialisiert" werden, die Methode aufgerufen werden und der neue
127     Zustand wieder serialisiert werden.
128    
129     Für das Finger-Protokoll würde das in etwa so aussehen (völlig fiktive
130     Syntax):
131    
132     # wird aufgerufen, wenn Daten geschrieben werden können
133     sub can_write {
134     my ($self) = @_;
135    
136 root 1.10 # Request blockierend schreiben, da klein
137 root 1.3 print {$self->{fh}} $self->{username};
138 root 1.10 # sorge dafür, daß beim nächsten Mal can_read aufgerufen wird
139 root 1.3 $self->next_event ($self->{fh}, "readable", "can_read");
140     }
141    
142 root 1.10 # wird aufgerufen, wenn Daten vorliegen
143 root 1.3 sub can_read {
144     my ($self) = q_;
145    
146     sysread $self->{fh}, $self->{response}, length $self->{response}, 8192
147     or $self->next_event (undef, undef, "finish");
148     }
149    
150     C<can_write> schreibt den Request und sorgt dann dafür, daß der Zustand
151 root 1.10 "can_read" angenommen wird, bei dem die Methode desselben Namens aufgerufen
152 root 1.3 wird, sobald Daten vom Dateihandle gelesen werden können.
153    
154     C<can_read> liest nun die Daten ein und verbleibt im aktuellen Zustand,
155     solange Daten gelesen werden können. Bei Fehlern oder bei Verbindungsende
156 root 1.10 wird in den Zustand "finish" gesprungen. Typischerweise gibt es noch
157 root 1.3 andere Methoden, die z.B. bei Fehlern aufgerufen werden können.
158    
159     Persönlich finde ich diesen Stil äußerst masochistisch und verwirrend,
160 root 1.10 aber es soll Programmierer geben, die anders denken. Für mich zählt aber
161 root 1.3 vor allem die Menge an Quellcode, die erzeugt und gewartet werden muss,
162     sowie das weite Auseinanderliegen wichtiger Stellen - der Ablauf ist nicht
163     klar.
164    
165     Trotzdem ist dieser Stil häufig vertreten - meistens nicht in dieser
166     Klarheit sondern in Kombination mit anderen Stilen (im obigen Beispiel
167 root 1.10 wird z.B. die Anfrage nicht ereignisgesteuert geschrieben) - in der
168 root 1.3 Realität muss man zwischen Klarheit, Geschwindigkeit, Abhängigkeiten und
169 root 1.10 vielem mehr abwägen!
170 root 1.3
171 root 1.1 =head2 Continuation Passing
172    
173 root 1.3 Ein etwas weniger häufig benutzter Stil ist Continuation Passing. Die
174     Ursache für das seltenere Vorkommen liegt I<meiner Meinung> nach darin,
175     daß dies in anderen (verbreiteten) Programmiersprachen (C, Python, ...)
176     weniger oder garnicht gut realisierbar ist, bzw. dies etwas Verständnis
177     und Wissen erfordert, was heutzutage nicht mehr gefördert wird.
178    
179     Wie dem auch sei, hier ein Beispiel wie man eine Datei öffnet und einige
180 root 1.10 Daten liest, und sie dann löscht, mit C<IO::AIO> und voller Fehlerbehandlung:
181 root 1.3
182     aio_open "tempfile", O_RDONLY, 0, sub {
183     my $fh = shift
184     or die "tempfile: $!";
185    
186     my $buf;
187     aio_read $fh, 0, 8192, $buf, 0, sub {
188     $_[0] > 0 # keine leeren Files
189     or die "tempfile: $!";
190    
191     aio_unlink "tempfile", sub {
192     $_[0] and die "tempfile: $!";
193    
194 root 1.10 print "read successfully up to 8192 bytes, and nuked file.\n";
195 root 1.3 };
196     };
197     };
198    
199     Das Schema ist immer das gleiche: Bei jeder Anforderung (open/read/unlink)
200     wird eine Closure übergeben (die Zustandsdaten und Reaktion verkörpert),
201     die nach Beendigung der Anforderung aufgerufen wird. C<aio_open> kehrt
202     sofort zurück, aber die Closure wird erst dann aufgerufen, wenn die Datei
203     geöffnet wurde oder ein Fehler auftrat.
204    
205     Der Name dieses Stils kommt daher, daß bei jeder Anforderung die komplette
206     "Fortsetzung" (Continuation) des Programmablaufes mit übergeben wird.
207    
208 root 1.10 Die Vorteile des Stils liegen darin, daß die logische (nicht zeitliche)
209     lineare Reihenfolge klar bleibt und daß alles nahe beieinander
210     steht. Die Nachteile sind das zunehmende Nesting und die weniger flexiblen
211 root 1.3 Reaktionsmöglichkeiten. Außerdem bietet sich nicht jede Art der
212 root 1.10 Anforderung gleichermaßen an: C<IO::AIO> fördert diesen Stil. Bei C<Event> wird
213 root 1.3 es meistens etwas umständlicher, da mehr Parameter zu übergeben sind und
214     die Watcher nach jedem Ereignis per Hand gelöscht werden müssen.
215    
216     Beides läßt sich umgehen, indem man sich in Richtung State-Maschine
217     bewegt:
218    
219     sub do_open {
220     aio_open ..., sub {
221     do_read (@_);
222     };
223     }
224    
225     sub do_read {
226     my ($fh) = @_;
227    
228     aio_read ..., sub {
229     do_unlink ($fh, @_);
230     };
231     }
232    
233     sub do_unlink {
234     ...
235     }
236    
237     Das ist erstmal umständlicher, aber sehr langen Closures manchmal
238     vorzuziehen. Der Zustand wird hier nicht in einem Objekt gespeichert,
239     sondern in den Closures (z.B. C<$fh> bei C<aio_read>).
240    
241     =head2 Coroutinen/Threads/Prozesse
242    
243 root 1.10 Der letzte Stil besteht darin, für jeden logischen Ablauf eine Coroutine,
244 root 1.3 einen Thread oder einen Prozess zu benutzen. Die Nachteile nenne ich
245     gleich: Coroutinen sind nicht in Perl integriert und daher etwas
246     unportabler als Perl selbst, Threads stehen in Perl überhaupt nicht zur
247     Verfügung, und Prozesse sind relativ große Dinger, von denen man sich
248     nicht wirklich viele halten möchte.
249    
250     Das obige C<IO::AIO>-Beispiel sähe mit Hilfe von C<Coro::AIO> so aus:
251    
252     my $fh = aio_open "tempfile", O_RDONLY, 0
253     or die "tempfile: $!";
254     aio_read $fh, 0, 8192, my $buf, 0
255     or die "tempfile empty or read error ($!)";
256     aio_unlink "tempfile";
257    
258 root 1.10 Meiner Meinung nach ist dies die klarste Methode, komplett
259     ereignisgesteuerte Abläufe darzustellen. Der Overhead, der durch die
260 root 1.3 Verwaltung von Coroutinen entsteht, ist allerdings höher als der anderer
261 root 1.4 Ansätze (allerdings niedriger als bei Threads oder Prozesse), und stellt
262     daher das andere Ende des Overhead vs. Einfachheit-Gegensatzes dar.
263 root 1.1
264    
265     =head1 Event-Modelle
266    
267 root 1.6 Perl strotzt geradezu vor Event-Modellen. Das ist keine gute Nachricht, da
268 root 1.4 sie alle inkompatibel sind.
269    
270     Entstanden ist diese Situation dadurch, daß C<select> zwar prinzipiell
271     alles ermöglicht, aber nicht sehr freundlich ist. Daher entstand schnell
272     der Wunsch nach Wrapper und angenehmeren Schnittstellen. Vor allem
273 root 1.10 GUI-Toolkits bringen im allgemeinen ein eigenes Event-Modell mit, da hier
274 root 1.4 der Bedarf nach Ereignissteuerung besonders hoch ist, um die Latenz für
275     Benutzerinteraktionen niedrig zu halten.
276    
277     Leider wird dies meistens nebensächlich behandelt - Gtk+/Glib z.B. hat ein
278     sehr umständliches Event-Modell, daß sich auch nicht durch Exaktheit z.B.
279     bei Timern hervortut.
280    
281     Im folgenden will ich einige Event-Modelle kurz ansprechen:
282    
283 root 1.1 =head2 Event
284    
285 root 1.4 Das "Standard"-Eventmodul von Perl. Sollte es zumindest sein. Es bietet
286 root 1.6 mit Abstand die vernünftigste API! (!!) (!!!) (Wirklich!)
287 root 1.4
288     Die beiden wichtigsten Ereignisse, auf die ein Event-Modell reagieren können muss, sind
289     IO-Ready-Ereignisse (Daten können gelesen/geschrieben werden), Timer (Zeitsteuerung). Außerdem
290     braucht man noch eine Schnittstelle für die Hauptschleife.
291    
292     Mit Event sieht dies so aus:
293    
294     # Auf Daten warten:
295     Event->io (fd => $fh, poll => 'r', cb => sub {
296     # es kann nichtblockierend gelesen werden
297     });
298    
299     # Jede Stunde was tun:
300     Event->timer (after => 3600, interval => 3600, cb => sub {
301     # tue was
302     });
303    
304     # Hauptschleife:
305     Event::loop;
306 root 1.1
307 root 1.4 Leider ist die Entwicklung des Event-Modules eingeschlafen - es ist zwar
308     stabil und hat keine bekannten/relevanten Fehler, aber Patches z.B. für
309 root 1.10 die Unterstützung (in bestimmten Situationen) besser skalierender
310 root 1.4 Betriebssystem-Schnittstellen als C<select> wandern nicht oder nur halb in
311     die Distribution.
312    
313     Dennoch stellt Event nahezu das Optimum dar.
314    
315     =head2 Glib (Gtk2)
316    
317     Glib implementiert das Event-Modell für Gtk+, sowie noch vieles weiteres,
318     wie z.B. Datentypen und Klassen (was die Unterstützung für Skript-Sprachen
319     so angenehm macht).
320    
321     Die drei Beispiele lauten in Glib-Lingo so:
322    
323     # Auf Daten warten:
324     add_watch Glib::IO fileno $fh, ['in', 'hup'], sub {
325     # es kann nichtblockierend gelesen werden
326    
327     1 # wir wollen weitere Ereignisse dieser Art
328     };
329    
330     # Jede Stunde was tun:
331     add Glib::Timeout 3600_000, sub {
332     # tue was
333    
334     1 # auch nächste Stunde sind wir für sie da
335     };
336    
337     # Hauptschleife:
338     1 while Glib::MainContext->default->iteration (1);
339    
340     # bzw.in Gtk2-Programmen:
341     main Gtk2;
342    
343     Interessanterweise erlaubt es Glib, die eigentliche C<select> (bzw.
344     hier: C<poll>) Funktion durch eine eigene zu ersetzen, was z.B. das
345     C<Glib::Event>-Modul ausnutzt.
346    
347     =head2 Tk
348    
349     Tk ist das traurigste Beispiel für ein Event-Modell: entweder etwas
350     ist nicht implementiert, oder es ist kaputt. Dennoch lassen sich die
351 root 1.10 wichtigsten Ereignisse mit Einschränkungen abbilden:
352 root 1.4
353     # Richtig, wir brauchen tatsächlich ein Fenster!
354     $mw = new MainWindow; # Namespace-Invasion
355     withdraw $mw; # Flickerflacker
356    
357     # Auf Daten warten, nur ein watcher per filehandle
358     $mw->fileevent ($fh, readable => sub {
359     # es kann nichtblockierend gelesen werden
360     });
361    
362     # _Ungefähr_ jede Stunde was tun
363     my $cb; $cb = sub {
364     # tue was
365    
366     $mw->after (3600_000, $cb);
367     };
368     $mw->after (3600_000, $cb);
369    
370     # Hauptschleife:
371     Tk::MainLoop;
372    
373     An Tk sieht man deutlich, daß die Priorität eines Windowing-Toolkits eben
374     beim Windowing liegt, und nicht in der Event-API.
375    
376     =head2 Qt
377    
378     Besitzt jemand Informationen zu Qt? Perl+Qt scheint mir ziemlich tot zu
379     sein...
380 root 1.1
381    
382     =head1 Das Problem für Modulautoren
383    
384 root 1.4 Das Problem für Modulautoren ist ganz einfach: Das Hauptprogramm kann
385     immer nur ein Event-Modell gleichzeitig benutzen. Benutzt man in seinem
386     Modul das gleiche, ist man fein raus, benutzt man ein anderes, geht es
387     nicht. Garnicht.
388    
389     Also versuchen es viele Modul-Autoren garnicht erst und bieten nur eine
390 root 1.10 nicht ereignisgesteuerte Schnittstelle an - benutzt man LWP in einem
391 root 1.4 Gtk+-Programm, hängt es, bis die Daten da sind - nicht gerade toll.
392    
393 root 1.1
394     =head1 Lösungen/Workarounds
395    
396 root 1.4 Welche Lösungen und Workarounds gibt es für dieses Problem?
397    
398 root 1.1 =head2 Wozu? Blocking reicht - LWP
399    
400 root 1.4 Naja, dies ist kein Workaround, aber wie gesagt die Norm unter den
401     vorhanden Modulen (wobei das keine Ausrede ist, um nicht wenigstens ein
402     Modell wie z.B. Event zu unterstützen...).
403    
404     LWP ist dabei nur ein Beispiel:
405    
406     my $data = get $url;
407    
408     So sieht es auch bei fast allen Net::*-Modulen aus. Es gibt Workarounds
409     (technisch ausgedrückt "böse Hacks"), um auch solche Module zu zwingen,
410     aber sie sind bestenfalls nicht schön, und schlimmstenfalls kaputt, wenn
411 root 1.8 die zugrundeliegende Bibliothek globale Variablen auf mit Parallelität
412     nicht vereinbarer Weise benutzt - man müsste reinschauen können. Solche
413     Workarounds können meistens nur im Hauptprogramm eingesetzt werden.
414 root 1.4
415 root 1.5 =head2 Überlass es dem User - KGS::Protocol
416 root 1.4
417     Dies ist eine weitere, praktikable Möglichkeit, an das Problem
418     heranzutreten, ein Beispiel dafür ist das (völlig unbedeutende)
419     KGS::Protocol-Modul:
420    
421     my $socket = new IO::Socket::INET ... # blockierender connect
422     $socket->blocking (0); # seufz
423    
424     my $conn = new KGS::Protocol;
425    
426     ...
427    
428     Event->io (fd => $socket, poll => 'r', cb => sub {
429     sysread $socket, my $buffer, 8192;
430    
431     $conn->feed_data ($buffer);
432     });
433    
434     Das C<KGS::Protocol>-Modul weiss recht wenig über Sockets oder über
435     Dateihandles - das bleibt dem Benutzer des Moduls überlassen. Dieser
436     muss irgendwie (z.B. mit C<Event>) die Daten beschaffen und sie mit
437     C<feed_data> an das Modul übergeben.
438    
439     Schreiben geschieht immer noch blockierend, was bei C<KGS::Protocol> in
440     der Praxis keine Relevanz hat. Das Modul läßt sich auch ohne Dateihandles
441 root 1.10 betreiben, was z.B. für Replays von aufgezeichneten Protokollen benutzt
442 root 1.4 werden kann - in seltenen Fällen ist das extrem hilfreich.
443    
444     Ein anderes Modul, C<Net::Knuddels>, erlaubt diese Freiheit nicht,
445     hat aber dafür eine einfachere API. C<Net::Knuddels> braucht zwei
446 root 1.10 Ereignistypen: Eine Verzögerung um Flooding zu vermeiden und das "Daten
447     können gelesen werden"-Ereignis.
448 root 1.4
449     Das sieht dann so aus:
450    
451     $client = new Net::Knuddels::Client
452     PeerAddr => "213.61.5.150:2710",
453     command_wait => sub {
454     my ($client, $wait) = @_;
455     Event->timer (after => $wait, cb => sub { $client->command_cb });
456     };
457    
458     Event->io (
459     fd => $client->fh,
460     poll => 'r',
461     cb => sub {
462     $client->ready
463     or $_[0]->w->cancel;
464     });
465    
466     Mit C<command_wait> übergibt man einen Callback, der nach einer bestimmten
467 root 1.10 Zeit (C<$wait>) die C<command_cb>-Methode aufrufen soll. Wie er das
468     macht, ist relativ wurscht. Die Default-Implementation des Moduls
469     schläft einfach die entsprechende Zeit und ruft dann direkt die
470 root 1.4 C<command_cb>-Methode auf. Im obigen Beispiel wird ein Time-Watcher
471 root 1.10 erzeugt, der C<command_cb> aufruft, und kehrt dann sofort zurück.
472 root 1.4
473     Diese Methode funktioniert, weil das Problem garnicht erst gelöst
474     wird: Es wird lediglich zum Aufrufer hin verlagert. Ist der Aufrufer
475     das Hauptprogramm, muss es Event-Watcher erzeugen, ist der Aufrufer ein
476     anderes Modul, hat dies wieder das gleiche Problem - entweder legt es ein
477     Event-Modell fest oder er schiebt es wieder zu seinem Aufrufer.
478    
479     Hierbei muss der Aufrufer entsprechend aufgeklärt werden, was die API
480     etwas verkompliziert.
481 root 1.1
482     =head2 Leg dich fest - Coro::Event
483    
484 root 1.4 Eine weitere Methode ist es, sich festzulegen. Das Coro-Modul benötigte
485     dringend Events, und hat sich auf das Event-Modul eingeschossen (hey, es
486     ist der Standard...). C<Coro::Event> ist daher recht effizient und einfach
487     zu benutzen (nahezu gleiche API wie C<Event> selbst), unterstützt aber
488     (zur Zeit) auch nur das Event-Modul.
489    
490     Das ist nicht unbedingt schlimmer als nur eine blockierende API
491     anzubieten, da man schlimmstenfalls immer eine blockierende API erstellen
492 root 1.10 kann - so laufen alle Coro::Event-Benutzer untereinander ereignisgesteuert,
493 root 1.4 aber z.B. ein Glib-Benutzer wird blockiert.
494    
495 root 1.1 =head2 Bilde ein Modell auf ein anderes ab - Glib::Event
496    
497 root 1.4 Manchmal hat man Glück und benutzt zwei Event-Modelle, die man mit Gewalt
498     kombinieren kann. Eine häufige Kombination ist Gtk2 (also Glib) zusammen
499     mit Event. Und die Lösung lautet C<Glib::Event>:
500    
501     use Gtk2 -init;
502     use Glib::Event;
503    
504     Jetzt kann man beliebige Module benutzen, die selbst Event benutzen, oder
505     direkt Event benutzen, wenn einem dessen API mehr zusagt:
506    
507     use Event;
508    
509     Event->timer (after => 1, interval => 1, cb => sub { ... });
510    
511     main Gtk2;
512    
513     Tatsächlich funktioniert C<Glib::Event> sogar unabhängig vom Glib-Modul mit
514     jedem Programm, daß selbst die libglib benutzt und Perl z.B. einbettet.
515    
516     C<Glib::Event> bringt die libglib dazu, intern Event zu benutzen. Das
517     macht aus Glib noch keinen Event-Benutzer (man muss immer noch die
518     Glib-Hauptschleife aufrufen, C<Event::loop> funktioniert nicht), begrenzt
519 root 1.10 das Problem aber immerhin auf den Aufruf der Hauptschleife, der nur einmal
520 root 1.4 pro Programm vorkommt.
521    
522     Tatsächlich kann man sich mit Coroutinen behelfen, indem man die
523     Gtk+-Hauptschleife in eine Coroutine verlagert:
524    
525     use Gtk2 -init;
526     use Coro;
527     use Coro::Event;
528     use Glib::Event;
529     async { main Gtk2 };
530     # tue andere Dinge
531     Event::loop;
532    
533     =head2 Threads (?) und Prozesse
534    
535     Threads würden ebenfalls helfen, da man zumindest theoretisch jedes
536     Event-Modell in seinem eigenen Thread laufen lassen könnte. Leider nur
537     theoretisch, da die meisten Event-Modelle damit nicht klarkommen, und
538     Threads von Perl sowieso nicht unterstützt werden (der irrige Begriff
539     "Thread" bezeichnet in Perl eine Prozessemulation auf Thread-Basis, der
540     eingeführt wurde, um die extrem langsame Prozess-Erzeugung unter Windows
541     zu beschleunigen und später aus nicht nachvollziehbaren Gründen auf Unix
542     portiert wurde. Perl-"Threads" vereinigen die Nachteile von Prozessen und
543     Threads mit extrem hohem Overhead ohne die jeweiligen Vorteile zu bieten).
544    
545     Bleiben also nur separate Prozesse, was nicht sehr angenehm ist, aber in
546     vielen Fällen durchaus gangbar. Z.B. kann man LWP auf diese Weise begrenzt
547     parallelisieren:
548    
549     # Warnung: keine Fehlerbehandlung
550     if (open my $subproc, "-|") {
551     Event->io (fd => $subproc, poll => 'r', cb => sub {
552     local $/;
553     my $webpage = <$subproc>;
554     });
555     } else {
556     print get $url;
557     }
558    
559     Mit Perl-Threads gestaltet es sich etwas umständlicher und vor allem
560 root 1.10 wesentlich ressourcenintensiver (außer unter Windows, wo Prozesse sowieso
561 root 1.4 mit Threads emuliert werden und der Aufwand daher gleich (und gleich
562     I<hoch>) ist).
563    
564     =head2 AnyEvent
565    
566     Ein relativ neues Modul ist C<AnyEvent>. Der Name ist angelehnt
567     an C<AnyDBM_File>, da es wie dieses Modul versucht, eine
568 root 1.10 implementationsunabhängige API zu liefern.
569 root 1.4
570     AnyEvent ist also kein eigenes Event-Modell, sondern nur eine
571     Schnittstelle zu einem existierenden. Der Vorteil für Modul-Autoren
572     ist nun, daß sie AnyEvent als Event-Modell benutzen können, sich aber
573     gleichzeitig sicher sein können, daß ihr Modul mit Event, Gtk+, Tk oder
574     sogar rxvt-unicode zusammenarbeiten. Das Modul ist erweiterbar, so daß
575     jede weitere Implementation automatisch mit vorhandenen Modulen läuft.
576    
577     Natürlich kann AnyEvent nur das unterstützen, was alle verwendeten
578     Event-Modelle unterstützen. Den kleinsten gemeinsamen Nenner sozusagen,
579     den man schnell mit C<Tk> identifizieren kann :)
580    
581     Die API ist an die Event-API angelehnt, unterscheidet sich aber in einigen
582     Punkten. Die drei Standardbeispiele sehen bei C<AnyEvent> so aus:
583    
584     # Auf Daten warten:
585     my $watcher = AnyEvent->io (fh => $fh, poll => 'r', cb => sub {
586     # es kann nichtblockierend gelesen werden
587     });
588     # wird der watcher vergessen, wird er zerstört, deshalb muss man
589     # ihn aufbewahren
590    
591     # _Ungefähr_ jede Stunde was tun:
592     my $w;
593     my $cb; $cb = sub {
594     # tue was
595    
596     $w = AnyEvent->timer (after => 3600, cb => $cb);
597     };
598     $cb->();
599    
600     # Hauptschleife:
601     AnyEvent->condvar->new->wait;
602    
603     Statt einem Filedeskriptor oder eines Handles akzeptiert AnyEvent nur
604 root 1.9 letzteren (C<fh> statt C<fd>). Pollen kann man z.Zt. nur nach 'r'ead oder
605 root 1.4 'w'write -Ereignissen, und Timer sind immer relativ zu "jetzt" und feuern
606     nur einmal.
607    
608     Am fremdartigsten ist sicher das, was unter "Hauptschleife"
609     steht: AnyEvent zielt vor allem auf Modul-Autoren. Diese brauchen
610 root 1.10 manchmal eine Schnittstelle in die Hauptschleife, ohne sie direkt
611 root 1.4 aufzurufen. C<condvar>s (Condition Variables, Bedingungsvariablen) kann
612     man sich am ehesten als "Fertig-Indikator" vorstellen. Jede C<condvar>
613 root 1.10 hat zwei Methoden: C<wait>, mit dem auf das Erreichen der Bedingung
614 root 1.4 gewartet werden kann, und C<broadcast>, mit der an alle Interessenten ein
615     "Bedingung erfüllt"-Signal gesendet werden kann.
616    
617     Beispielsweise implementiert das folgende Fragment eine Art interaktive
618     Shell, deren "quit"-Befehl das Programm beenden soll:
619    
620     use AnyEvent;
621    
622     my $want_to_quit = AnyEvent->condvar;
623    
624     my $io_watcher = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
625     my $command = <STDIN>;
626    
627     $command eq "quit"
628     and $want_to_quit->broadcast
629     });
630    
631     $want_to_quit->wait;
632    
633     Dieses Beispiel benutzt eine Condition-Variable namens C<$want_to_quit>
634 root 1.5 ("Beenden erwünscht"), die die Bedingung (wer hätte es gedacht) "Benutzer
635 root 1.4 wünscht das Beenden des Programms" ausdrückt.
636    
637     C<< $want_to_quit->wait >> wartet daher, bis diese Bedingung
638     eintritt. Nebenher läuft aber die Ereignisverarbeitung weiter, bis
639     der Event-Callback das Kommando "quit" einliest und das Eintreten der
640     Bedingung C<broadcast>et.
641    
642     In Modulen benutzt man C<condvars> am besten pro "Request", um das
643     Eintreten bestimmer Zustände (meistens "fertig") zu repräsentieren.
644 root 1.1
645 root 1.4 Wie man das macht und wozu das dient beschreibt der nächste Abschnitt.
646 root 1.1
647    
648 root 1.5 =head1 Fallbeispiel Modul-API: IO::AIO und Coro::AIO
649    
650     Das C<IO::AIO>-Modul bietet eine Schnittstelle für asynchrones I/O
651     an. D.h. man kann damit Dateien lesen, schreiben, löschen und vieles
652     mehr, ohne daß man auf das Ergebnis warten müsste. Keine Frage, es ist
653 root 1.10 ereignisgesteuert, oder besser gesagt, es wandelt I/O-Anfragen in einen
654     Strom von Ergebnisereignissen um.
655 root 1.5
656     Es stammt aus der Zeit vor AnyEvent und sollte deshalb völlig
657     unabhängig vom verwendeten Event-Modell benutzt werden können. Dies
658     wird erreicht, indem es einen Dateideskriptor zur Verfügung
659     stellt, der lesbar wird, sobald Ergebnisse vorliegen. Diesen
660     Dateideskriptor (C<IO::AIO::poll_fileno>) übergibt man einfach seinem
661     bevorzugten Event-Modell und sorgt dafür, daß bei Lesbarkeit die
662     C<IO::AIO::poll_cb>-Funktion aufgerufen wird.
663    
664 root 1.10 C<IO::AIO> gibt in der Dokumentation Beispiele für die Integration in
665 root 1.5 eine Menge Event-Modelle an:
666    
667     # AnyEvent
668     open my $fh, "<&=" . IO::AIO::poll_fileno or die "$!";
669     my $w = AnyEvent->io (fh => $fh, poll => 'r',
670     cb => sub { IO::AIO::poll_cb });
671    
672     # Event
673     Event->io (fd => IO::AIO::poll_fileno,
674     poll => 'r',
675     cb => \&IO::AIO::poll_cb);
676    
677     # Glib/Gtk2
678     add_watch Glib::IO IO::AIO::poll_fileno,
679     in => sub { IO::AIO::poll_cb; 1 };
680    
681     # Tk
682     Tk::Event::IO->fileevent (IO::AIO::poll_fileno, "",
683     readable => \&IO::AIO::poll_cb);
684    
685     # Danga::Socket
686     Danga::Socket->AddOtherFds (IO::AIO::poll_fileno =>
687     \&IO::AIO::poll_cb);
688    
689     Das Prinzip ist wirklich immer das gleiche.
690    
691     Man kann IO::AIO auch ohne ein Event-Modell benutzen:
692    
693     # jede Menge afragen
694     aio_xxx ... for 1..100000000;
695    
696     # warte bis es ekien ausstehenden Requests mehr gibt:
697     IO::AIO::poll_wait, IO::AIO::poll_cb
698     while IO::AIO::nreqs;
699    
700     # naja, in neueren Versionen geht es auch so:
701     IO::AIO::flush;
702    
703     Das Modul C<Coro::AIO> bildet die C<IO::AIO>-API auf eine blockierende
704     aber Coroutinen-kompatible API ab. Dies geschieht programmatisch (es wurde
705     also nicht für jede IO::AIO::aio_*-Funktion eine Coro::AIO::aio_*-Funktion
706     implementiert).
707    
708     Um dem Benutzer die Qual der Wahl eines Event-Modells zu ersparen, erzeugt
709     C<Coro::AIO> gleich einen AnyEvent-Watcher:
710    
711     our $FH; open $FH, "<&=" . IO::AIO::poll_fileno;
712     our $WATCHER = AnyEvent->io (fh => $FH, poll => 'r'
713     cb => sub { IO::AIO::poll_cb });
714    
715     Es ist nicht tragisch, wenn der mal nicht aufgerufen wird, weil der
716     Benutzer von C<Coro::AIO> andere Vorstellungen hat, solange nur
717     irgendjemand C<IO::AIO::poll_cb> aufruft.
718    
719    
720 root 1.2 =head1 Fallbeispiel Modul-API: Net-FCP und AnyEvent
721 root 1.1
722 root 1.5 C<Net::FCP> ist für das Freenet in etwa das, was LWP fürs Web ist. Meiner
723     Meinung nach ist die API von C<Net::FCP> geradezu ideal, da sie eine
724     sehr einfache Benutzung erlaubt (ähnlich LWP und LWP::Simple), und
725     trotzdem kompliziertere Anwendungen ermöglicht.
726    
727     Freenet ist ein typisches Anfrage-Antwort-Protokoll, genau wie
728     HTTP. Die wichtigste Methode ist die C<client_get>-Methode, mit der man
729     Freenet-Objekte herunterladen kann:
730    
731     my $fcp = new Net::FCP;
732    
733     my $data = $fcp->client_get (
734     "freenet:SSK@xK6UnCmOBL1bMf-VZBDTQfvYTFwPAgM/LiberalDecalogue//"
735     );
736    
737     Die Methode verhält sich (fast) wie C<LWP::Simple::get>: sie wartet so
738     lange, bis das Ergebnis angekommen ist oder ein Fehler aufgetreten ist
739     (letztere werden durch Exceptions weitergegeben).
740    
741     =head3 Blockierende API
742    
743     Alle Anfragen des Freenet-Protokolls (neben client_get gibt es noch viele
744     weitere) besitzen eine gleichnamige Methode, die eine Verbindung aufbaut,
745     die Anfrage losschickt und auf Antwort wartet:
746    
747     my $data = $fcp->client_get ($uri);
748     $fcp->client_put ($uri, $metadata, $data, $htl);
749     $fcp->generate_chk ($metadata, $data);
750     ...
751    
752 root 1.10 Für einfache Anwendungen reicht diese Schnittstelle völlig aus. Da Net::FCP
753     intern ereignisgesteuert ist, laufen solche Anfragen aber auch problemlos
754 root 1.5 in einer eigenen Coroutine, parallel zu anderen Anfragen, ohne daß der
755 root 1.10 aufrufende Code (oder Net::FCP) irgendetwas Spezielles machen müsste.
756 root 1.5
757     =head3 Nichtblockierende API
758    
759     Tatsächlich sind alle diese Methoden autogeneriert, d.h. sie mussten
760 root 1.10 nicht mal geschrieben werden. Tatsächlich müssen "nur" Methoden geschrieben
761 root 1.5 werden, die eine Transaktion starten:
762    
763     my $transaction = $fcp->txn_client_get ($uri);
764    
765     Diese Methoden erzeugen lediglich ein neues Objekt (eine Transaktion), die
766     den Zustand der gesamten Protokollabfrage darstellt und kehren I<sofort>
767     zum Aufrufer zurück. Man kann der Transaktion einen Callback übergeben,
768     der aufgerufen wird, sobald ein Ergebnis vorliegt:
769    
770     $transaction->cb (sub {
771     # Juchhee, wir haben die Daten! Oder einen Fehler...
772     });
773    
774     Und natürlich kann man das Ergebnis auch abfragen:
775    
776     my $data = $transaction->result;
777     # Entweder werden heir die Daten zurückgegeben,
778     # oder es wird eine Exception ausgelöst.
779    
780     Wenn die Ergebnisse schon vorliegen, blockiert C<result> nicht, ansonsten
781     wartete es, bis dies der Fall ist.
782    
783     Das allgemeine Prinzip ist, jede Anfrage in zwei Teile aufzuteilen: Start
784     der Transaktion und Ankunft der Ergebnisse.
785    
786 root 1.2 =head2 Benutzung
787 root 1.1
788 root 1.5 Diese beiden APIs erlauben eine erstaunliche Vielfalt an Nutzungsstilen:
789    
790     =head3 Blockierend
791    
792     Ganz einfach blockierend. Hier wäre z.B. eine einfache, wget-artige
793     Applikation, die eine Freenet-URL herunterlädt und die Daten ausgibt:
794    
795     # client_get liefetr eine Arrayref mit Metadaten und Daten.
796     print Net::FCP->new->client_get (shift)->[1];
797    
798     =head3 Blockierend, mit Coroutinen
799    
800     Das hypothetische Modul C<Net::Supergeil> benutzt die Freenet-API zum
801 root 1.10 Herunterladen von Videos. Leider ist es selbst nicht ereignisgesteuert und
802 root 1.5 blockiert den Aufrufer ein paar Tage.
803    
804 root 1.6 Kein Problem, wir stecken den Aufruf in eine Coroutine:
805 root 1.5
806     use Coro;
807     # Lade/wähle das Event-Modell:
808     use Coro::Event;
809    
810     async {
811     Net::Supergeil::lad_es_runter $uri, $file;
812     print "Daten sind in $file\n";
813     };
814    
815     # tue etwas anderes...
816     ...
817     Coro::Event::loop;
818    
819     Das funktioniert deshalb, weil Net::FCP ereignisgesteuert arbeitet und
820     Coro::Event, sofern keine Ereignisse vorliegen, einfach andere Coroutinen
821     ausführt.
822    
823     =head3 Nichtblockierend, Parallel
824    
825 root 1.10 Durch die Aufteilung in Start- und Ergebnisteile kann man die Anfragen
826 root 1.5 einfach parallelisieren (was bei Freenet extrem wichtig ist):
827    
828     my @results = map $_->result,
829     map $fcp->txn_client_get ($_),
830     @uris;
831    
832     Da mir gesagt wurde, C<map> sei sowas wie Magie, hier das ganze in
833     Javaspeak:
834    
835     my @txns;
836     for my $url (@urls) {
837     push @txns, $fcp->txn_client_get ($url);
838     }
839     my @results;
840     for my $txn (@txns) {
841     push @results, $txn->result;
842     }
843    
844     (Es gibt Leute, die behaupten, das wäre klarer und einfacher zu
845     maintainen).
846    
847     Zuerst wird jede URL in eine Transaktion umgewandelt. Bis auf Erzeugen
848     einer Datenstruktur und einer Socket passiert dabei nicht viel, das ganze
849     geht also schnell.
850    
851     Dann wird die C<result>-Methode jeder Transaktion bemüht. Da zu diesem
852     Zeitpunkt mit Sicherheit noch keine Ergebnisse vorliegen (schlicht
853     deshalb, weil nicht einmal der Verbindungsaufbau abgeschlossen ist),
854     blockiert C<result>.
855    
856     Dies führt indirekt zu einem Sprung in die Hauptschleife des verwendeten
857     Event-Modells, wodurch alle Anfragen ins Rollen kommen und parallel
858     (genauer: zeitlich eng verzahnt) durchgeführt werden. Sind die Ergebnisse
859 root 1.10 einer Transaktion angekommen (manche dauern länger, manche sind schnell),
860 root 1.5 so wird die C<result>-Methode der nächsten Transaktion aufgerufen. Dann
861     gibt es wieder zwei Möglichkeiten: entweder es gibt schon Ergebnisse, dann
862 root 1.10 geht's sofort weiter, oder eben nicht, dann wird wieder blockiert und ein
863 root 1.5 bisschen weiter gearbeitet.
864    
865 root 1.10 Das Schöne an dieser Art der Nutzung ist, daß überhaupt keine Aufrufe
866 root 1.5 irgendwelcher Event-Module auftauchen, und man sich auch nicht darum
867     kümmern braucht, welches Event-Modell benutzt wird.
868    
869     =head3 Nichtblockierend, Continuation Passing
870    
871     Das folgende Fragment lädt ein Freenet-Paket herunter. Ist es eine
872     Redirection, so lädt es die Seite herunter, auf die es zeigt:
873    
874     $fcp->txn_client_get ($uri)->cb ({
875     my $data = $_[0]->result;
876     if (ist ein redirect) {
877     $fcp->txn_client_get ($redirect_uri)->cb ({
878     my $data = $_[0]->result;
879     # fertig
880     });
881     } else {
882     # fertig
883     }
884     });
885    
886     Für die ausgelassenen Teile ("fertig") bietet sich eine
887     C<< AnyEvent->condvar >> an:
888    
889     my $got_it = AnyEvent->condvar;
890    
891     # und statt "fertig":
892     $got_it->broadcast;
893    
894     =head3 Andere...
895    
896     Prinzipiell läßt sich C<Net::FCP> auch in State-Maschinen
897     u.ä. einbauen: Net::FCP verhält sich wie ein Event-Modell für
898     Freenet-Ereignisse.
899    
900 root 1.2 =head2 Implementation
901 root 1.1
902 root 1.10 Die Implementation ist vergleichsweise einfach und geradlinig. Ein gewisser
903 root 1.6 Grundaufwand ist nicht zu vermeiden, aber man erreicht mit wenig Aufwand
904     vergleichsweise viel.
905    
906     Damit man wenig Aufwand treiben muss, gibt es eine Hilfsfunktion, die
907     sowohl die Methode mit C<txn_>-Präfix generiert als auch die ohne:
908    
909     my $txn = sub {
910     my ($name, $sub) = @_;
911     *{"txn_$name"} = $sub;
912     *{$name} = sub { $sub->(@_)->result };
913     };
914    
915     Der Aufruf ist ganz einfach:
916    
917     $txn->(client_hello => sub {
918     my ($self) = @_;
919     $self->txn ("client_hello");
920     });
921    
922     Das erzeugt sowohl die C<client_hello>- als auch die
923     C<txn_client_hello>-Methode. Die Methode ohne C<txn_> ist immer nach
924     demselben Muster aufgebaut:
925    
926     txn_xxx(@_)->result
927    
928     d.h. die Transaktion wird erzeugt und dann wird sofort C<< ->result >>
929     darauf aufgerufen. Das erzeugt dann die einfache blockierende API.
930    
931 root 1.10 Für C<client_get> sieht es etwas komplizierter - aber im Prinzip genauso - aus:
932 root 1.6
933     $txn->(client_get => sub {
934     my ($self, $uri, $htl, $removelocal) = @_;
935    
936     $uri =~ s/^freenet://; $uri = "freenet:$uri";
937    
938     $self->txn (client_get => URI => $uri
939     hops_to_live => xeh (defined $htl ? $htl : 15),
940     remove_local_key => $removelocal ? "true" : "false");
941     });
942    
943     Da alle Anfragen/Transaktionen ähnlich ablaufen (Verbindungsaufbau,
944     Anfrage hin, Antwort her, Ende), definiert Net::FCP die C<txn>-Hilfsmethode, die
945     eine Transaktion erzeugt:
946    
947     sub txn {
948     my ($self, $type, %attr) = @_;
949    
950     $type = touc $type;
951     "Net::FCP::Txn::$type"->new (fcp => $self, type => tolc $type, attr => \%attr);
952     }
953    
954     Jeder Anfragetyp besitzt seine eigene Klasse,
955     z.B. C<Net::FCP::Txn::client_get>, die jeweils von C<Net::FCP::Txn>
956     abgeleitet ist.
957    
958     Die C<new>-Methode erzeugt das Transaktionsobjekt und initiiert diese (ich
959     gebe nur die relevanten Zeilen an):
960    
961     sub new {
962     my $class = shift;
963     my $self = bless { @_ }, $class;
964    
965     $self->{signal} = AnyEvent->condvar;
966    
967     C<< $self->{signal} >> ist das "Ergebnis vorhanden"-Signal, eine
968     C<condvar>. Dann wird eine Socket erzeugt und die Verbindung initiiert:
969    
970     socket my $fh, PF_INET, SOCK_STREAM, 0
971     or Carp::croak "unable to create new tcp socket: $!";
972     binmode $fh, ":raw";
973     fcntl $fh, F_SETFL, O_NONBLOCK;
974     connect $fh, (sockaddr_in $self->{fcp}{port}, inet_aton $self->{fcp}{host})
975     and !$!{EWOULDBLOCK}
976     and !$!{EINPROGRESS}
977     and Carp::croak "FCP::txn: unable to connect to $self->{fcp}{host}:$self->{fcp}{port}: $!\n";
978    
979 root 1.10 Nun wird der zu sendende Header in C<< $self->{sbuf} >> verstaut
980 root 1.6
981     $self->{sbuf} =
982     "\x00\x00\x00\x02"
983     . (Net::FCP::touc $self->{type})
984     . "\012$attr$data";
985    
986 root 1.10 und ein Event-Watcher erzeugt. Wenn die Verbindung zustande kommt (oder
987 root 1.6 ein Fehler auftritt), wird die Socket schreibbar (genaugenommen blockiert
988     der Prozess nicht sofort, wenn man dann schreibt):
989    
990     $self->{w} = AnyEvent->io (fh => $fh, poll => 'w', cb => sub { $self->fh_ready_w });
991    
992     Und fertig:
993    
994     $self
995     }
996    
997     Bis auf C<inet_aton> blockiert keiner der benutzten Aufrufe, und da die
998 root 1.10 normale Adresse des Freenet-Hosts C<127.0.0.1> ist, wird C<inet_aton>
999     eher selten blockieren. Das Erzeugen der Transaktion geschieht also "so
1000 root 1.6 schnell wie es die CPU erlaubt".
1001    
1002     =head3 Senden
1003    
1004     Sobald die Socket "schreibbar" wird, wird die C<fh_ready_w>-Methode (in
1005     etwa: Filehandle bereit zum Schreiben) aufgerufen. Diese versucht, so viel
1006 root 1.10 der Anfrage ($self->{sbuf}) zu schreiben, wie die Socket annimmt:
1007 root 1.6
1008     sub fh_ready_w {
1009     my ($self) = @_;
1010    
1011     my $len = syswrite $self->{fh}, $self->{sbuf};
1012    
1013     Konnte etwas geschrieben werden, wird $self->{sbuf} entsprechend
1014     gekürzt. Ist es danach leer, ist die gesamte Anfrage geschrieben worden,
1015     und es wird in die Empfangsphase gegangen, indem der alte AnyEvent-Watcher
1016     überschrieben (und damit gelöscht wird) und ein neuer Watcher erzeugt
1017     wird, der auf "Daten lesbar" reagiert:
1018    
1019     if ($len > 0) {
1020     substr $self->{sbuf}, 0, $len, "";
1021     unless (length $self->{sbuf}) {
1022     $self->{w} = AnyEvent->io (fh => $self->{fh}, poll => 'r', cb => sub { $self->fh_ready_r });
1023     }
1024    
1025     Der Rest der Methode kümmert sich um die Fehlerbehandlung:
1026    
1027     } elsif (defined $len) {
1028     $self->throw (Net::FCP::Exception->new (network_error => { reason => "unexpected end of file while writing" }));
1029     } else {
1030     $self->throw (Net::FCP::Exception->new (network_error => { reason => "$!" }));
1031     }
1032     }
1033    
1034     Die Fehlerbehandlung ist übrigens nicht einfach ein Aufruf von C<die>. Die
1035     Idee ist, daß es nicht allzu hilfreich ist, wenn irgendwo tief in
1036     C<Net:FCP> ein Fehler auftritt, da nicht klar ist, wer für die Anfrage
1037 root 1.10 verantwortlich ist. (Vielleicht werden mehrere Server gleichzeitig befragt,
1038 root 1.6 aber einer wurde falsch angegeben. Ein Hinweis, welches Codefragment die
1039 root 1.10 Anfrage in Auftrag gegeben hat, wäre in diesem Fall hilfreich.)
1040 root 1.6
1041     C<Net::FCP> merkt sich daher jeden aufgetretenen Fehler und bricht die
1042     Transaktion ab:
1043    
1044     sub throw {
1045     my ($self, $exc) = @_;
1046    
1047     $self->{exception} = $exc;
1048     $self->set_result;
1049     $self->eof; # must be last to avoid loops
1050     }
1051    
1052     Die Methode C<eof> schließt einfach die Socket und gibt eventuell andere
1053 root 1.10 Ressourcen frei. Die C<set_result>-Methode wird immer aufgerufen, wenn die
1054 root 1.6 Transaktion ein Resultat hat (Daten, oder einen Fehler):
1055    
1056     sub set_result {
1057     my ($self, $result) = @_;
1058    
1059     $self->{result} = $result;
1060     $self->{cb}->($self) if exists $self->{cb};
1061     $self->{signal}->broadcast;
1062     }
1063    
1064     Sie sorgt dafür, das ein eventuell gesetzter Callback sofort ausgeführt
1065     wird und broadcastet das anfänglich erzeugte "fertig"-Signal.
1066    
1067     =head3 Empfangen
1068    
1069     Der Normalfall sollte aber das Erreichen der Empfangsphase sein. Sobald
1070     Daten vorliegen, wird C<fh_read_r> aufgerufen. Prinzipiell genauso
1071     aufgebaut wie C<fh_ready_w>, jedoch komplizierter, weil wir die Daten
1072     gleich beim Empfang parsen:
1073    
1074     sub fh_ready_r {
1075     my ($self) = @_;
1076    
1077     if (sysread $self->{fh}, $self->{buf}, 65536, length $self->{buf}) {
1078     for (;;) {
1079     if ($self->{datalen}) {
1080     if (length $self->{buf} >= $self->{datalen}) {
1081     $self->rcv_data (substr $self->{buf}, 0, delete $self->{datalen}, "");
1082     } else {
1083     last;
1084     }
1085     } elsif ($self->{buf} =~ s/^DataChunk\015?\012Length=([0-9a-fA-F]+)\015?\012Data\015?\012//) {
1086     $self->{datalen} = hex $1;
1087     } elsif ($self->{buf} =~ s/^([a-zA-Z]+)\015?\012(?:(.+?)\015?\012)?EndMessage\015?\012//s) {
1088     $self->rcv ($1, {
1089     map { my ($a, $b) = split /=/, $_, 2; ((Net::FCP::tolc $a), $b) }
1090     split /\015?\012/, $2
1091     });
1092     } else {
1093     last;
1094     }
1095     }
1096     } else {
1097     $self->eof;
1098     }
1099     }
1100    
1101     Das muss man jetzt nicht im Detail nachvollziehen, wichtig ist der Aufruf
1102     von C<sysread>, der Daten an den Skalar C<< $self->{buf} >> I<anhängt>.
1103 root 1.10 Sollten wieder Erwarten mal mehr als 64k Daten vorhanden sein, ist das
1104 root 1.6 übrigens nicht schlimm, da die Methode dann fast sofort wieder aufgerufen
1105     wird, solange, bis keine Daten mehr vorrätig sind.
1106    
1107     Ist nach Meinung der Methode alles angekommen, was ankommen sollte,
1108     wird die C<rcv>-Methode aufgerufen. Die macht noch ein bisschen was
1109     Spezifisches, je nach Anfragetyp, und ruft ihrerseits wieder C<set_result>
1110     auf.
1111    
1112 root 1.10 Bei Dateiende wird C<eof> aufgerufen, was übrigens nicht I<nur> Ressourcen
1113 root 1.6 freigibt, sondern auch einen Fehler auslöst, falls kein Resultat gesetzt
1114 root 1.10 wurde, was z.B. beim Verbindungsabbruch mitten in der Empfangsphase
1115 root 1.6 passiert.
1116    
1117     =head3 Ergebnis
1118    
1119 root 1.10 Ruft nun entweder der Callback oder jemand anders später die
1120     C<result>-Methode auf, so prüft diese zuerst, ob ein Resultat vorliegt,
1121 root 1.6 und wartet gegebenenfalls so lange, bis eines vorliegt:
1122    
1123     sub result {
1124     my ($self) = @_;
1125    
1126     $self->{signal}->wait unless exists $self->{result};
1127    
1128     C<condvars> fügen sich sehr natürlich in derlei Programme ein, da sie
1129     es ermöglichen, sowohl nichtblockierend als auch blockierend bestimmte
1130     Ereignisse anzuzeigen.
1131    
1132     Sollte ein Fehler aufgetreten sein, so wird die Exception sofort geworfen:
1133    
1134     die $self->{exception} if $self->{exception};
1135    
1136 root 1.7 Ein Backtrace ist dann viel aussagekräftiger, da das Programm dort
1137 root 1.6 abstürzt, wo die Daten verarbeitet werden sollen, was meistens
1138     Rückschlüsse auf die Art der Daten zuläßt :)
1139    
1140     Ansonsten bleibt nur, das Ergebnis zu liefern:
1141    
1142     $self->{result}
1143     }
1144    
1145     Fertig!
1146    
1147 root 1.5
1148