ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/docs/pws2006/event.pod
Revision: 1.11
Committed: Fri Jan 27 16:05:31 2006 UTC (20 years, 8 months ago) by root
Branch: MAIN
Changes since 1.10: +28 -23 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.11 In diesem Dokument wird der Begriff "blockierend" nicht als Gegensatz zu
110 root 1.4 diesem C<O_NONBLOCK> gebraucht, sondern allgemein verwendet, um jeglichen
111 root 1.11 Aufruf zu beschreiben, der auf bestimmte Ereignisse warten muss, statt
112     sofort zurückzukehren. Dies schließt nicht nur Dinge wie das Lesen von
113     Sockets, wenn keine Daten vorhanden sind, oder sleep()-ähnliche Aufrufe ein,
114     sondern auch Dinge wie das Lesen von einer Datei auf der Festplatte oder
115     von NFS, wenn die Daten nicht im RAM sind.
116 root 1.4
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 root 1.11 Die beiden wichtigsten Ereignisse, auf die ein Event-Modell reagieren
289     können muss, sind IO-Ready-Ereignisse (Daten können gelesen/geschrieben
290     werden) und Timer (Zeitsteuerung). Außerdem braucht man noch eine
291     Schnittstelle für die Hauptschleife.
292 root 1.4
293     Mit Event sieht dies so aus:
294    
295     # Auf Daten warten:
296     Event->io (fd => $fh, poll => 'r', cb => sub {
297     # es kann nichtblockierend gelesen werden
298     });
299    
300     # Jede Stunde was tun:
301     Event->timer (after => 3600, interval => 3600, cb => sub {
302     # tue was
303     });
304    
305     # Hauptschleife:
306     Event::loop;
307 root 1.1
308 root 1.4 Leider ist die Entwicklung des Event-Modules eingeschlafen - es ist zwar
309     stabil und hat keine bekannten/relevanten Fehler, aber Patches z.B. für
310 root 1.10 die Unterstützung (in bestimmten Situationen) besser skalierender
311 root 1.4 Betriebssystem-Schnittstellen als C<select> wandern nicht oder nur halb in
312     die Distribution.
313    
314     Dennoch stellt Event nahezu das Optimum dar.
315    
316     =head2 Glib (Gtk2)
317    
318     Glib implementiert das Event-Modell für Gtk+, sowie noch vieles weiteres,
319     wie z.B. Datentypen und Klassen (was die Unterstützung für Skript-Sprachen
320     so angenehm macht).
321    
322     Die drei Beispiele lauten in Glib-Lingo so:
323    
324     # Auf Daten warten:
325     add_watch Glib::IO fileno $fh, ['in', 'hup'], sub {
326     # es kann nichtblockierend gelesen werden
327    
328     1 # wir wollen weitere Ereignisse dieser Art
329     };
330    
331     # Jede Stunde was tun:
332     add Glib::Timeout 3600_000, sub {
333     # tue was
334    
335 root 1.11 1 # auch nächste Stunde sind wir wieder für Sie da
336 root 1.4 };
337    
338     # Hauptschleife:
339     1 while Glib::MainContext->default->iteration (1);
340    
341     # bzw.in Gtk2-Programmen:
342     main Gtk2;
343    
344     Interessanterweise erlaubt es Glib, die eigentliche C<select> (bzw.
345     hier: C<poll>) Funktion durch eine eigene zu ersetzen, was z.B. das
346     C<Glib::Event>-Modul ausnutzt.
347    
348     =head2 Tk
349    
350     Tk ist das traurigste Beispiel für ein Event-Modell: entweder etwas
351     ist nicht implementiert, oder es ist kaputt. Dennoch lassen sich die
352 root 1.10 wichtigsten Ereignisse mit Einschränkungen abbilden:
353 root 1.4
354     # Richtig, wir brauchen tatsächlich ein Fenster!
355     $mw = new MainWindow; # Namespace-Invasion
356     withdraw $mw; # Flickerflacker
357    
358     # Auf Daten warten, nur ein watcher per filehandle
359     $mw->fileevent ($fh, readable => sub {
360     # es kann nichtblockierend gelesen werden
361     });
362    
363     # _Ungefähr_ jede Stunde was tun
364     my $cb; $cb = sub {
365     # tue was
366    
367     $mw->after (3600_000, $cb);
368     };
369     $mw->after (3600_000, $cb);
370    
371     # Hauptschleife:
372     Tk::MainLoop;
373    
374     An Tk sieht man deutlich, daß die Priorität eines Windowing-Toolkits eben
375     beim Windowing liegt, und nicht in der Event-API.
376    
377     =head2 Qt
378    
379     Besitzt jemand Informationen zu Qt? Perl+Qt scheint mir ziemlich tot zu
380     sein...
381 root 1.1
382    
383     =head1 Das Problem für Modulautoren
384    
385 root 1.4 Das Problem für Modulautoren ist ganz einfach: Das Hauptprogramm kann
386     immer nur ein Event-Modell gleichzeitig benutzen. Benutzt man in seinem
387     Modul das gleiche, ist man fein raus, benutzt man ein anderes, geht es
388     nicht. Garnicht.
389    
390     Also versuchen es viele Modul-Autoren garnicht erst und bieten nur eine
391 root 1.10 nicht ereignisgesteuerte Schnittstelle an - benutzt man LWP in einem
392 root 1.4 Gtk+-Programm, hängt es, bis die Daten da sind - nicht gerade toll.
393    
394 root 1.1
395     =head1 Lösungen/Workarounds
396    
397 root 1.4 Welche Lösungen und Workarounds gibt es für dieses Problem?
398    
399 root 1.1 =head2 Wozu? Blocking reicht - LWP
400    
401 root 1.4 Naja, dies ist kein Workaround, aber wie gesagt die Norm unter den
402     vorhanden Modulen (wobei das keine Ausrede ist, um nicht wenigstens ein
403     Modell wie z.B. Event zu unterstützen...).
404    
405     LWP ist dabei nur ein Beispiel:
406    
407     my $data = get $url;
408    
409     So sieht es auch bei fast allen Net::*-Modulen aus. Es gibt Workarounds
410     (technisch ausgedrückt "böse Hacks"), um auch solche Module zu zwingen,
411     aber sie sind bestenfalls nicht schön, und schlimmstenfalls kaputt, wenn
412 root 1.8 die zugrundeliegende Bibliothek globale Variablen auf mit Parallelität
413     nicht vereinbarer Weise benutzt - man müsste reinschauen können. Solche
414     Workarounds können meistens nur im Hauptprogramm eingesetzt werden.
415 root 1.4
416 root 1.5 =head2 Überlass es dem User - KGS::Protocol
417 root 1.4
418     Dies ist eine weitere, praktikable Möglichkeit, an das Problem
419     heranzutreten, ein Beispiel dafür ist das (völlig unbedeutende)
420     KGS::Protocol-Modul:
421    
422     my $socket = new IO::Socket::INET ... # blockierender connect
423     $socket->blocking (0); # seufz
424    
425     my $conn = new KGS::Protocol;
426    
427     ...
428    
429     Event->io (fd => $socket, poll => 'r', cb => sub {
430     sysread $socket, my $buffer, 8192;
431    
432     $conn->feed_data ($buffer);
433     });
434    
435     Das C<KGS::Protocol>-Modul weiss recht wenig über Sockets oder über
436     Dateihandles - das bleibt dem Benutzer des Moduls überlassen. Dieser
437     muss irgendwie (z.B. mit C<Event>) die Daten beschaffen und sie mit
438     C<feed_data> an das Modul übergeben.
439    
440     Schreiben geschieht immer noch blockierend, was bei C<KGS::Protocol> in
441     der Praxis keine Relevanz hat. Das Modul läßt sich auch ohne Dateihandles
442 root 1.10 betreiben, was z.B. für Replays von aufgezeichneten Protokollen benutzt
443 root 1.4 werden kann - in seltenen Fällen ist das extrem hilfreich.
444    
445     Ein anderes Modul, C<Net::Knuddels>, erlaubt diese Freiheit nicht,
446     hat aber dafür eine einfachere API. C<Net::Knuddels> braucht zwei
447 root 1.10 Ereignistypen: Eine Verzögerung um Flooding zu vermeiden und das "Daten
448     können gelesen werden"-Ereignis.
449 root 1.4
450     Das sieht dann so aus:
451    
452     $client = new Net::Knuddels::Client
453     PeerAddr => "213.61.5.150:2710",
454     command_wait => sub {
455     my ($client, $wait) = @_;
456     Event->timer (after => $wait, cb => sub { $client->command_cb });
457     };
458    
459     Event->io (
460     fd => $client->fh,
461     poll => 'r',
462     cb => sub {
463     $client->ready
464     or $_[0]->w->cancel;
465     });
466    
467     Mit C<command_wait> übergibt man einen Callback, der nach einer bestimmten
468 root 1.10 Zeit (C<$wait>) die C<command_cb>-Methode aufrufen soll. Wie er das
469     macht, ist relativ wurscht. Die Default-Implementation des Moduls
470     schläft einfach die entsprechende Zeit und ruft dann direkt die
471 root 1.4 C<command_cb>-Methode auf. Im obigen Beispiel wird ein Time-Watcher
472 root 1.10 erzeugt, der C<command_cb> aufruft, und kehrt dann sofort zurück.
473 root 1.4
474     Diese Methode funktioniert, weil das Problem garnicht erst gelöst
475     wird: Es wird lediglich zum Aufrufer hin verlagert. Ist der Aufrufer
476     das Hauptprogramm, muss es Event-Watcher erzeugen, ist der Aufrufer ein
477     anderes Modul, hat dies wieder das gleiche Problem - entweder legt es ein
478     Event-Modell fest oder er schiebt es wieder zu seinem Aufrufer.
479    
480     Hierbei muss der Aufrufer entsprechend aufgeklärt werden, was die API
481     etwas verkompliziert.
482 root 1.1
483     =head2 Leg dich fest - Coro::Event
484    
485 root 1.4 Eine weitere Methode ist es, sich festzulegen. Das Coro-Modul benötigte
486     dringend Events, und hat sich auf das Event-Modul eingeschossen (hey, es
487     ist der Standard...). C<Coro::Event> ist daher recht effizient und einfach
488     zu benutzen (nahezu gleiche API wie C<Event> selbst), unterstützt aber
489     (zur Zeit) auch nur das Event-Modul.
490    
491     Das ist nicht unbedingt schlimmer als nur eine blockierende API
492     anzubieten, da man schlimmstenfalls immer eine blockierende API erstellen
493 root 1.10 kann - so laufen alle Coro::Event-Benutzer untereinander ereignisgesteuert,
494 root 1.4 aber z.B. ein Glib-Benutzer wird blockiert.
495    
496 root 1.1 =head2 Bilde ein Modell auf ein anderes ab - Glib::Event
497    
498 root 1.4 Manchmal hat man Glück und benutzt zwei Event-Modelle, die man mit Gewalt
499     kombinieren kann. Eine häufige Kombination ist Gtk2 (also Glib) zusammen
500     mit Event. Und die Lösung lautet C<Glib::Event>:
501    
502     use Gtk2 -init;
503     use Glib::Event;
504    
505     Jetzt kann man beliebige Module benutzen, die selbst Event benutzen, oder
506     direkt Event benutzen, wenn einem dessen API mehr zusagt:
507    
508     use Event;
509    
510     Event->timer (after => 1, interval => 1, cb => sub { ... });
511    
512     main Gtk2;
513    
514     Tatsächlich funktioniert C<Glib::Event> sogar unabhängig vom Glib-Modul mit
515     jedem Programm, daß selbst die libglib benutzt und Perl z.B. einbettet.
516    
517     C<Glib::Event> bringt die libglib dazu, intern Event zu benutzen. Das
518     macht aus Glib noch keinen Event-Benutzer (man muss immer noch die
519     Glib-Hauptschleife aufrufen, C<Event::loop> funktioniert nicht), begrenzt
520 root 1.10 das Problem aber immerhin auf den Aufruf der Hauptschleife, der nur einmal
521 root 1.4 pro Programm vorkommt.
522    
523     Tatsächlich kann man sich mit Coroutinen behelfen, indem man die
524     Gtk+-Hauptschleife in eine Coroutine verlagert:
525    
526     use Gtk2 -init;
527     use Coro;
528     use Coro::Event;
529     use Glib::Event;
530     async { main Gtk2 };
531     # tue andere Dinge
532     Event::loop;
533    
534     =head2 Threads (?) und Prozesse
535    
536     Threads würden ebenfalls helfen, da man zumindest theoretisch jedes
537     Event-Modell in seinem eigenen Thread laufen lassen könnte. Leider nur
538     theoretisch, da die meisten Event-Modelle damit nicht klarkommen, und
539     Threads von Perl sowieso nicht unterstützt werden (der irrige Begriff
540     "Thread" bezeichnet in Perl eine Prozessemulation auf Thread-Basis, der
541     eingeführt wurde, um die extrem langsame Prozess-Erzeugung unter Windows
542     zu beschleunigen und später aus nicht nachvollziehbaren Gründen auf Unix
543     portiert wurde. Perl-"Threads" vereinigen die Nachteile von Prozessen und
544     Threads mit extrem hohem Overhead ohne die jeweiligen Vorteile zu bieten).
545    
546     Bleiben also nur separate Prozesse, was nicht sehr angenehm ist, aber in
547     vielen Fällen durchaus gangbar. Z.B. kann man LWP auf diese Weise begrenzt
548     parallelisieren:
549    
550     # Warnung: keine Fehlerbehandlung
551     if (open my $subproc, "-|") {
552     Event->io (fd => $subproc, poll => 'r', cb => sub {
553     local $/;
554     my $webpage = <$subproc>;
555     });
556     } else {
557     print get $url;
558     }
559    
560     Mit Perl-Threads gestaltet es sich etwas umständlicher und vor allem
561 root 1.10 wesentlich ressourcenintensiver (außer unter Windows, wo Prozesse sowieso
562 root 1.4 mit Threads emuliert werden und der Aufwand daher gleich (und gleich
563     I<hoch>) ist).
564    
565     =head2 AnyEvent
566    
567     Ein relativ neues Modul ist C<AnyEvent>. Der Name ist angelehnt
568     an C<AnyDBM_File>, da es wie dieses Modul versucht, eine
569 root 1.10 implementationsunabhängige API zu liefern.
570 root 1.4
571     AnyEvent ist also kein eigenes Event-Modell, sondern nur eine
572     Schnittstelle zu einem existierenden. Der Vorteil für Modul-Autoren
573     ist nun, daß sie AnyEvent als Event-Modell benutzen können, sich aber
574     gleichzeitig sicher sein können, daß ihr Modul mit Event, Gtk+, Tk oder
575     sogar rxvt-unicode zusammenarbeiten. Das Modul ist erweiterbar, so daß
576     jede weitere Implementation automatisch mit vorhandenen Modulen läuft.
577    
578     Natürlich kann AnyEvent nur das unterstützen, was alle verwendeten
579     Event-Modelle unterstützen. Den kleinsten gemeinsamen Nenner sozusagen,
580     den man schnell mit C<Tk> identifizieren kann :)
581    
582     Die API ist an die Event-API angelehnt, unterscheidet sich aber in einigen
583     Punkten. Die drei Standardbeispiele sehen bei C<AnyEvent> so aus:
584    
585     # Auf Daten warten:
586     my $watcher = AnyEvent->io (fh => $fh, poll => 'r', cb => sub {
587     # es kann nichtblockierend gelesen werden
588     });
589     # wird der watcher vergessen, wird er zerstört, deshalb muss man
590     # ihn aufbewahren
591    
592     # _Ungefähr_ jede Stunde was tun:
593     my $w;
594     my $cb; $cb = sub {
595     # tue was
596    
597     $w = AnyEvent->timer (after => 3600, cb => $cb);
598     };
599     $cb->();
600    
601     # Hauptschleife:
602     AnyEvent->condvar->new->wait;
603    
604 root 1.11 Statt eines Filedeskriptors oder Handles akzeptiert AnyEvent nur
605 root 1.9 letzteren (C<fh> statt C<fd>). Pollen kann man z.Zt. nur nach 'r'ead oder
606 root 1.11 'w'rite -Ereignissen, und Timer sind immer relativ zu "jetzt" und feuern
607 root 1.4 nur einmal.
608    
609     Am fremdartigsten ist sicher das, was unter "Hauptschleife"
610     steht: AnyEvent zielt vor allem auf Modul-Autoren. Diese brauchen
611 root 1.10 manchmal eine Schnittstelle in die Hauptschleife, ohne sie direkt
612 root 1.4 aufzurufen. C<condvar>s (Condition Variables, Bedingungsvariablen) kann
613     man sich am ehesten als "Fertig-Indikator" vorstellen. Jede C<condvar>
614 root 1.10 hat zwei Methoden: C<wait>, mit dem auf das Erreichen der Bedingung
615 root 1.4 gewartet werden kann, und C<broadcast>, mit der an alle Interessenten ein
616     "Bedingung erfüllt"-Signal gesendet werden kann.
617    
618     Beispielsweise implementiert das folgende Fragment eine Art interaktive
619     Shell, deren "quit"-Befehl das Programm beenden soll:
620    
621     use AnyEvent;
622    
623     my $want_to_quit = AnyEvent->condvar;
624    
625     my $io_watcher = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
626     my $command = <STDIN>;
627    
628     $command eq "quit"
629     and $want_to_quit->broadcast
630     });
631    
632     $want_to_quit->wait;
633    
634     Dieses Beispiel benutzt eine Condition-Variable namens C<$want_to_quit>
635 root 1.5 ("Beenden erwünscht"), die die Bedingung (wer hätte es gedacht) "Benutzer
636 root 1.4 wünscht das Beenden des Programms" ausdrückt.
637    
638     C<< $want_to_quit->wait >> wartet daher, bis diese Bedingung
639     eintritt. Nebenher läuft aber die Ereignisverarbeitung weiter, bis
640     der Event-Callback das Kommando "quit" einliest und das Eintreten der
641     Bedingung C<broadcast>et.
642    
643     In Modulen benutzt man C<condvars> am besten pro "Request", um das
644     Eintreten bestimmer Zustände (meistens "fertig") zu repräsentieren.
645 root 1.1
646 root 1.4 Wie man das macht und wozu das dient beschreibt der nächste Abschnitt.
647 root 1.1
648    
649 root 1.5 =head1 Fallbeispiel Modul-API: IO::AIO und Coro::AIO
650    
651     Das C<IO::AIO>-Modul bietet eine Schnittstelle für asynchrones I/O
652     an. D.h. man kann damit Dateien lesen, schreiben, löschen und vieles
653     mehr, ohne daß man auf das Ergebnis warten müsste. Keine Frage, es ist
654 root 1.10 ereignisgesteuert, oder besser gesagt, es wandelt I/O-Anfragen in einen
655     Strom von Ergebnisereignissen um.
656 root 1.5
657     Es stammt aus der Zeit vor AnyEvent und sollte deshalb völlig
658     unabhängig vom verwendeten Event-Modell benutzt werden können. Dies
659     wird erreicht, indem es einen Dateideskriptor zur Verfügung
660     stellt, der lesbar wird, sobald Ergebnisse vorliegen. Diesen
661     Dateideskriptor (C<IO::AIO::poll_fileno>) übergibt man einfach seinem
662     bevorzugten Event-Modell und sorgt dafür, daß bei Lesbarkeit die
663     C<IO::AIO::poll_cb>-Funktion aufgerufen wird.
664    
665 root 1.10 C<IO::AIO> gibt in der Dokumentation Beispiele für die Integration in
666 root 1.5 eine Menge Event-Modelle an:
667    
668     # AnyEvent
669     open my $fh, "<&=" . IO::AIO::poll_fileno or die "$!";
670     my $w = AnyEvent->io (fh => $fh, poll => 'r',
671     cb => sub { IO::AIO::poll_cb });
672    
673     # Event
674     Event->io (fd => IO::AIO::poll_fileno,
675     poll => 'r',
676     cb => \&IO::AIO::poll_cb);
677    
678     # Glib/Gtk2
679     add_watch Glib::IO IO::AIO::poll_fileno,
680     in => sub { IO::AIO::poll_cb; 1 };
681    
682     # Tk
683     Tk::Event::IO->fileevent (IO::AIO::poll_fileno, "",
684     readable => \&IO::AIO::poll_cb);
685    
686     # Danga::Socket
687     Danga::Socket->AddOtherFds (IO::AIO::poll_fileno =>
688     \&IO::AIO::poll_cb);
689    
690     Das Prinzip ist wirklich immer das gleiche.
691    
692     Man kann IO::AIO auch ohne ein Event-Modell benutzen:
693    
694 root 1.11 # jede Menge Anfragen
695 root 1.5 aio_xxx ... for 1..100000000;
696    
697 root 1.11 # warte bis es keine ausstehenden Requests mehr gibt:
698 root 1.5 IO::AIO::poll_wait, IO::AIO::poll_cb
699     while IO::AIO::nreqs;
700    
701     # naja, in neueren Versionen geht es auch so:
702     IO::AIO::flush;
703    
704     Das Modul C<Coro::AIO> bildet die C<IO::AIO>-API auf eine blockierende
705     aber Coroutinen-kompatible API ab. Dies geschieht programmatisch (es wurde
706     also nicht für jede IO::AIO::aio_*-Funktion eine Coro::AIO::aio_*-Funktion
707     implementiert).
708    
709     Um dem Benutzer die Qual der Wahl eines Event-Modells zu ersparen, erzeugt
710     C<Coro::AIO> gleich einen AnyEvent-Watcher:
711    
712     our $FH; open $FH, "<&=" . IO::AIO::poll_fileno;
713     our $WATCHER = AnyEvent->io (fh => $FH, poll => 'r'
714     cb => sub { IO::AIO::poll_cb });
715    
716     Es ist nicht tragisch, wenn der mal nicht aufgerufen wird, weil der
717     Benutzer von C<Coro::AIO> andere Vorstellungen hat, solange nur
718     irgendjemand C<IO::AIO::poll_cb> aufruft.
719    
720    
721 root 1.2 =head1 Fallbeispiel Modul-API: Net-FCP und AnyEvent
722 root 1.1
723 root 1.5 C<Net::FCP> ist für das Freenet in etwa das, was LWP fürs Web ist. Meiner
724     Meinung nach ist die API von C<Net::FCP> geradezu ideal, da sie eine
725     sehr einfache Benutzung erlaubt (ähnlich LWP und LWP::Simple), und
726     trotzdem kompliziertere Anwendungen ermöglicht.
727    
728     Freenet ist ein typisches Anfrage-Antwort-Protokoll, genau wie
729     HTTP. Die wichtigste Methode ist die C<client_get>-Methode, mit der man
730     Freenet-Objekte herunterladen kann:
731    
732     my $fcp = new Net::FCP;
733    
734     my $data = $fcp->client_get (
735     "freenet:SSK@xK6UnCmOBL1bMf-VZBDTQfvYTFwPAgM/LiberalDecalogue//"
736     );
737    
738     Die Methode verhält sich (fast) wie C<LWP::Simple::get>: sie wartet so
739     lange, bis das Ergebnis angekommen ist oder ein Fehler aufgetreten ist
740     (letztere werden durch Exceptions weitergegeben).
741    
742     =head3 Blockierende API
743    
744     Alle Anfragen des Freenet-Protokolls (neben client_get gibt es noch viele
745     weitere) besitzen eine gleichnamige Methode, die eine Verbindung aufbaut,
746     die Anfrage losschickt und auf Antwort wartet:
747    
748     my $data = $fcp->client_get ($uri);
749     $fcp->client_put ($uri, $metadata, $data, $htl);
750     $fcp->generate_chk ($metadata, $data);
751     ...
752    
753 root 1.10 Für einfache Anwendungen reicht diese Schnittstelle völlig aus. Da Net::FCP
754     intern ereignisgesteuert ist, laufen solche Anfragen aber auch problemlos
755 root 1.5 in einer eigenen Coroutine, parallel zu anderen Anfragen, ohne daß der
756 root 1.10 aufrufende Code (oder Net::FCP) irgendetwas Spezielles machen müsste.
757 root 1.5
758     =head3 Nichtblockierende API
759    
760 root 1.11 Tatsächlich sind alle Methoden autogeneriert (wie, wird noch beschrieben),
761     die Freenet-Abfragen durchführen, d.h. sie mussten nicht mal geschrieben
762     werden. Tatsächlich müssen "nur" Methoden geschrieben werden, die eine
763     Transaktion starten:
764 root 1.5
765     my $transaction = $fcp->txn_client_get ($uri);
766    
767 root 1.11 Diese Methoden erzeugen lediglich ein neues Objekt (eine Transaktion), das
768 root 1.5 den Zustand der gesamten Protokollabfrage darstellt und kehren I<sofort>
769     zum Aufrufer zurück. Man kann der Transaktion einen Callback übergeben,
770     der aufgerufen wird, sobald ein Ergebnis vorliegt:
771    
772     $transaction->cb (sub {
773     # Juchhee, wir haben die Daten! Oder einen Fehler...
774     });
775    
776     Und natürlich kann man das Ergebnis auch abfragen:
777    
778     my $data = $transaction->result;
779 root 1.11 # Entweder werden hier die Daten zurückgegeben,
780 root 1.5 # oder es wird eine Exception ausgelöst.
781    
782     Wenn die Ergebnisse schon vorliegen, blockiert C<result> nicht, ansonsten
783     wartete es, bis dies der Fall ist.
784    
785     Das allgemeine Prinzip ist, jede Anfrage in zwei Teile aufzuteilen: Start
786     der Transaktion und Ankunft der Ergebnisse.
787    
788 root 1.2 =head2 Benutzung
789 root 1.1
790 root 1.5 Diese beiden APIs erlauben eine erstaunliche Vielfalt an Nutzungsstilen:
791    
792     =head3 Blockierend
793    
794     Ganz einfach blockierend. Hier wäre z.B. eine einfache, wget-artige
795     Applikation, die eine Freenet-URL herunterlädt und die Daten ausgibt:
796    
797     # client_get liefetr eine Arrayref mit Metadaten und Daten.
798     print Net::FCP->new->client_get (shift)->[1];
799    
800     =head3 Blockierend, mit Coroutinen
801    
802 root 1.11 Das hypothetische Modul C<Net::Supergeil> benutzt das Net::FCP-Modul zum
803 root 1.10 Herunterladen von Videos. Leider ist es selbst nicht ereignisgesteuert und
804 root 1.5 blockiert den Aufrufer ein paar Tage.
805    
806 root 1.6 Kein Problem, wir stecken den Aufruf in eine Coroutine:
807 root 1.5
808     use Coro;
809     # Lade/wähle das Event-Modell:
810     use Coro::Event;
811    
812     async {
813     Net::Supergeil::lad_es_runter $uri, $file;
814     print "Daten sind in $file\n";
815     };
816    
817     # tue etwas anderes...
818     ...
819     Coro::Event::loop;
820    
821 root 1.11 Das funktioniert deshalb, weil Net::FCP ereignisgesteuert arbeitet
822     und Coro::Event, sofern keine Ereignisse vorliegen, einfach andere
823     Coroutinen ausführt. Obwohl Net::Supergeil keine sehr hilfreiche API zur
824     Verfügung stellt, kann man es trotzdem Ereignisgesteuert einsetzen, weil
825     alle blockierenden Routinen, die es auf ruft, intern Ereignisgesteuert
826     arbeiten.
827 root 1.5
828     =head3 Nichtblockierend, Parallel
829    
830 root 1.10 Durch die Aufteilung in Start- und Ergebnisteile kann man die Anfragen
831 root 1.5 einfach parallelisieren (was bei Freenet extrem wichtig ist):
832    
833     my @results = map $_->result,
834     map $fcp->txn_client_get ($_),
835     @uris;
836    
837     Da mir gesagt wurde, C<map> sei sowas wie Magie, hier das ganze in
838     Javaspeak:
839    
840     my @txns;
841     for my $url (@urls) {
842     push @txns, $fcp->txn_client_get ($url);
843     }
844     my @results;
845     for my $txn (@txns) {
846     push @results, $txn->result;
847     }
848    
849     (Es gibt Leute, die behaupten, das wäre klarer und einfacher zu
850     maintainen).
851    
852     Zuerst wird jede URL in eine Transaktion umgewandelt. Bis auf Erzeugen
853     einer Datenstruktur und einer Socket passiert dabei nicht viel, das ganze
854     geht also schnell.
855    
856     Dann wird die C<result>-Methode jeder Transaktion bemüht. Da zu diesem
857     Zeitpunkt mit Sicherheit noch keine Ergebnisse vorliegen (schlicht
858     deshalb, weil nicht einmal der Verbindungsaufbau abgeschlossen ist),
859     blockiert C<result>.
860    
861     Dies führt indirekt zu einem Sprung in die Hauptschleife des verwendeten
862     Event-Modells, wodurch alle Anfragen ins Rollen kommen und parallel
863     (genauer: zeitlich eng verzahnt) durchgeführt werden. Sind die Ergebnisse
864 root 1.10 einer Transaktion angekommen (manche dauern länger, manche sind schnell),
865 root 1.5 so wird die C<result>-Methode der nächsten Transaktion aufgerufen. Dann
866     gibt es wieder zwei Möglichkeiten: entweder es gibt schon Ergebnisse, dann
867 root 1.10 geht's sofort weiter, oder eben nicht, dann wird wieder blockiert und ein
868 root 1.5 bisschen weiter gearbeitet.
869    
870 root 1.10 Das Schöne an dieser Art der Nutzung ist, daß überhaupt keine Aufrufe
871 root 1.5 irgendwelcher Event-Module auftauchen, und man sich auch nicht darum
872     kümmern braucht, welches Event-Modell benutzt wird.
873    
874     =head3 Nichtblockierend, Continuation Passing
875    
876     Das folgende Fragment lädt ein Freenet-Paket herunter. Ist es eine
877     Redirection, so lädt es die Seite herunter, auf die es zeigt:
878    
879     $fcp->txn_client_get ($uri)->cb ({
880     my $data = $_[0]->result;
881     if (ist ein redirect) {
882     $fcp->txn_client_get ($redirect_uri)->cb ({
883     my $data = $_[0]->result;
884     # fertig
885     });
886     } else {
887     # fertig
888     }
889     });
890    
891     Für die ausgelassenen Teile ("fertig") bietet sich eine
892     C<< AnyEvent->condvar >> an:
893    
894     my $got_it = AnyEvent->condvar;
895    
896     # und statt "fertig":
897     $got_it->broadcast;
898    
899     =head3 Andere...
900    
901     Prinzipiell läßt sich C<Net::FCP> auch in State-Maschinen
902     u.ä. einbauen: Net::FCP verhält sich wie ein Event-Modell für
903     Freenet-Ereignisse.
904    
905 root 1.2 =head2 Implementation
906 root 1.1
907 root 1.10 Die Implementation ist vergleichsweise einfach und geradlinig. Ein gewisser
908 root 1.6 Grundaufwand ist nicht zu vermeiden, aber man erreicht mit wenig Aufwand
909     vergleichsweise viel.
910    
911     Damit man wenig Aufwand treiben muss, gibt es eine Hilfsfunktion, die
912     sowohl die Methode mit C<txn_>-Präfix generiert als auch die ohne:
913    
914     my $txn = sub {
915     my ($name, $sub) = @_;
916     *{"txn_$name"} = $sub;
917     *{$name} = sub { $sub->(@_)->result };
918     };
919    
920     Der Aufruf ist ganz einfach:
921    
922     $txn->(client_hello => sub {
923     my ($self) = @_;
924     $self->txn ("client_hello");
925     });
926    
927     Das erzeugt sowohl die C<client_hello>- als auch die
928     C<txn_client_hello>-Methode. Die Methode ohne C<txn_> ist immer nach
929     demselben Muster aufgebaut:
930    
931     txn_xxx(@_)->result
932    
933     d.h. die Transaktion wird erzeugt und dann wird sofort C<< ->result >>
934     darauf aufgerufen. Das erzeugt dann die einfache blockierende API.
935    
936 root 1.10 Für C<client_get> sieht es etwas komplizierter - aber im Prinzip genauso - aus:
937 root 1.6
938     $txn->(client_get => sub {
939     my ($self, $uri, $htl, $removelocal) = @_;
940    
941     $uri =~ s/^freenet://; $uri = "freenet:$uri";
942    
943     $self->txn (client_get => URI => $uri
944     hops_to_live => xeh (defined $htl ? $htl : 15),
945     remove_local_key => $removelocal ? "true" : "false");
946     });
947    
948     Da alle Anfragen/Transaktionen ähnlich ablaufen (Verbindungsaufbau,
949     Anfrage hin, Antwort her, Ende), definiert Net::FCP die C<txn>-Hilfsmethode, die
950     eine Transaktion erzeugt:
951    
952     sub txn {
953     my ($self, $type, %attr) = @_;
954    
955     $type = touc $type;
956     "Net::FCP::Txn::$type"->new (fcp => $self, type => tolc $type, attr => \%attr);
957     }
958    
959     Jeder Anfragetyp besitzt seine eigene Klasse,
960     z.B. C<Net::FCP::Txn::client_get>, die jeweils von C<Net::FCP::Txn>
961     abgeleitet ist.
962    
963     Die C<new>-Methode erzeugt das Transaktionsobjekt und initiiert diese (ich
964     gebe nur die relevanten Zeilen an):
965    
966     sub new {
967     my $class = shift;
968     my $self = bless { @_ }, $class;
969    
970     $self->{signal} = AnyEvent->condvar;
971    
972     C<< $self->{signal} >> ist das "Ergebnis vorhanden"-Signal, eine
973     C<condvar>. Dann wird eine Socket erzeugt und die Verbindung initiiert:
974    
975     socket my $fh, PF_INET, SOCK_STREAM, 0
976     or Carp::croak "unable to create new tcp socket: $!";
977     binmode $fh, ":raw";
978     fcntl $fh, F_SETFL, O_NONBLOCK;
979     connect $fh, (sockaddr_in $self->{fcp}{port}, inet_aton $self->{fcp}{host})
980     and !$!{EWOULDBLOCK}
981     and !$!{EINPROGRESS}
982     and Carp::croak "FCP::txn: unable to connect to $self->{fcp}{host}:$self->{fcp}{port}: $!\n";
983    
984 root 1.10 Nun wird der zu sendende Header in C<< $self->{sbuf} >> verstaut
985 root 1.6
986     $self->{sbuf} =
987     "\x00\x00\x00\x02"
988     . (Net::FCP::touc $self->{type})
989     . "\012$attr$data";
990    
991 root 1.10 und ein Event-Watcher erzeugt. Wenn die Verbindung zustande kommt (oder
992 root 1.6 ein Fehler auftritt), wird die Socket schreibbar (genaugenommen blockiert
993     der Prozess nicht sofort, wenn man dann schreibt):
994    
995     $self->{w} = AnyEvent->io (fh => $fh, poll => 'w', cb => sub { $self->fh_ready_w });
996    
997     Und fertig:
998    
999     $self
1000     }
1001    
1002     Bis auf C<inet_aton> blockiert keiner der benutzten Aufrufe, und da die
1003 root 1.10 normale Adresse des Freenet-Hosts C<127.0.0.1> ist, wird C<inet_aton>
1004     eher selten blockieren. Das Erzeugen der Transaktion geschieht also "so
1005 root 1.6 schnell wie es die CPU erlaubt".
1006    
1007     =head3 Senden
1008    
1009     Sobald die Socket "schreibbar" wird, wird die C<fh_ready_w>-Methode (in
1010     etwa: Filehandle bereit zum Schreiben) aufgerufen. Diese versucht, so viel
1011 root 1.10 der Anfrage ($self->{sbuf}) zu schreiben, wie die Socket annimmt:
1012 root 1.6
1013     sub fh_ready_w {
1014     my ($self) = @_;
1015    
1016     my $len = syswrite $self->{fh}, $self->{sbuf};
1017    
1018     Konnte etwas geschrieben werden, wird $self->{sbuf} entsprechend
1019     gekürzt. Ist es danach leer, ist die gesamte Anfrage geschrieben worden,
1020     und es wird in die Empfangsphase gegangen, indem der alte AnyEvent-Watcher
1021     überschrieben (und damit gelöscht wird) und ein neuer Watcher erzeugt
1022     wird, der auf "Daten lesbar" reagiert:
1023    
1024     if ($len > 0) {
1025     substr $self->{sbuf}, 0, $len, "";
1026     unless (length $self->{sbuf}) {
1027     $self->{w} = AnyEvent->io (fh => $self->{fh}, poll => 'r', cb => sub { $self->fh_ready_r });
1028     }
1029    
1030     Der Rest der Methode kümmert sich um die Fehlerbehandlung:
1031    
1032     } elsif (defined $len) {
1033     $self->throw (Net::FCP::Exception->new (network_error => { reason => "unexpected end of file while writing" }));
1034     } else {
1035     $self->throw (Net::FCP::Exception->new (network_error => { reason => "$!" }));
1036     }
1037     }
1038    
1039     Die Fehlerbehandlung ist übrigens nicht einfach ein Aufruf von C<die>. Die
1040     Idee ist, daß es nicht allzu hilfreich ist, wenn irgendwo tief in
1041     C<Net:FCP> ein Fehler auftritt, da nicht klar ist, wer für die Anfrage
1042 root 1.10 verantwortlich ist. (Vielleicht werden mehrere Server gleichzeitig befragt,
1043 root 1.6 aber einer wurde falsch angegeben. Ein Hinweis, welches Codefragment die
1044 root 1.10 Anfrage in Auftrag gegeben hat, wäre in diesem Fall hilfreich.)
1045 root 1.6
1046     C<Net::FCP> merkt sich daher jeden aufgetretenen Fehler und bricht die
1047     Transaktion ab:
1048    
1049     sub throw {
1050     my ($self, $exc) = @_;
1051    
1052     $self->{exception} = $exc;
1053     $self->set_result;
1054     $self->eof; # must be last to avoid loops
1055     }
1056    
1057     Die Methode C<eof> schließt einfach die Socket und gibt eventuell andere
1058 root 1.10 Ressourcen frei. Die C<set_result>-Methode wird immer aufgerufen, wenn die
1059 root 1.6 Transaktion ein Resultat hat (Daten, oder einen Fehler):
1060    
1061     sub set_result {
1062     my ($self, $result) = @_;
1063    
1064     $self->{result} = $result;
1065     $self->{cb}->($self) if exists $self->{cb};
1066     $self->{signal}->broadcast;
1067     }
1068    
1069     Sie sorgt dafür, das ein eventuell gesetzter Callback sofort ausgeführt
1070     wird und broadcastet das anfänglich erzeugte "fertig"-Signal.
1071    
1072     =head3 Empfangen
1073    
1074     Der Normalfall sollte aber das Erreichen der Empfangsphase sein. Sobald
1075     Daten vorliegen, wird C<fh_read_r> aufgerufen. Prinzipiell genauso
1076     aufgebaut wie C<fh_ready_w>, jedoch komplizierter, weil wir die Daten
1077     gleich beim Empfang parsen:
1078    
1079     sub fh_ready_r {
1080     my ($self) = @_;
1081    
1082     if (sysread $self->{fh}, $self->{buf}, 65536, length $self->{buf}) {
1083     for (;;) {
1084     if ($self->{datalen}) {
1085     if (length $self->{buf} >= $self->{datalen}) {
1086     $self->rcv_data (substr $self->{buf}, 0, delete $self->{datalen}, "");
1087     } else {
1088     last;
1089     }
1090     } elsif ($self->{buf} =~ s/^DataChunk\015?\012Length=([0-9a-fA-F]+)\015?\012Data\015?\012//) {
1091     $self->{datalen} = hex $1;
1092     } elsif ($self->{buf} =~ s/^([a-zA-Z]+)\015?\012(?:(.+?)\015?\012)?EndMessage\015?\012//s) {
1093     $self->rcv ($1, {
1094     map { my ($a, $b) = split /=/, $_, 2; ((Net::FCP::tolc $a), $b) }
1095     split /\015?\012/, $2
1096     });
1097     } else {
1098     last;
1099     }
1100     }
1101     } else {
1102     $self->eof;
1103     }
1104     }
1105    
1106     Das muss man jetzt nicht im Detail nachvollziehen, wichtig ist der Aufruf
1107     von C<sysread>, der Daten an den Skalar C<< $self->{buf} >> I<anhängt>.
1108 root 1.10 Sollten wieder Erwarten mal mehr als 64k Daten vorhanden sein, ist das
1109 root 1.6 übrigens nicht schlimm, da die Methode dann fast sofort wieder aufgerufen
1110     wird, solange, bis keine Daten mehr vorrätig sind.
1111    
1112     Ist nach Meinung der Methode alles angekommen, was ankommen sollte,
1113     wird die C<rcv>-Methode aufgerufen. Die macht noch ein bisschen was
1114     Spezifisches, je nach Anfragetyp, und ruft ihrerseits wieder C<set_result>
1115     auf.
1116    
1117 root 1.10 Bei Dateiende wird C<eof> aufgerufen, was übrigens nicht I<nur> Ressourcen
1118 root 1.6 freigibt, sondern auch einen Fehler auslöst, falls kein Resultat gesetzt
1119 root 1.10 wurde, was z.B. beim Verbindungsabbruch mitten in der Empfangsphase
1120 root 1.6 passiert.
1121    
1122     =head3 Ergebnis
1123    
1124 root 1.10 Ruft nun entweder der Callback oder jemand anders später die
1125     C<result>-Methode auf, so prüft diese zuerst, ob ein Resultat vorliegt,
1126 root 1.6 und wartet gegebenenfalls so lange, bis eines vorliegt:
1127    
1128     sub result {
1129     my ($self) = @_;
1130    
1131     $self->{signal}->wait unless exists $self->{result};
1132    
1133     C<condvars> fügen sich sehr natürlich in derlei Programme ein, da sie
1134     es ermöglichen, sowohl nichtblockierend als auch blockierend bestimmte
1135     Ereignisse anzuzeigen.
1136    
1137     Sollte ein Fehler aufgetreten sein, so wird die Exception sofort geworfen:
1138    
1139     die $self->{exception} if $self->{exception};
1140    
1141 root 1.7 Ein Backtrace ist dann viel aussagekräftiger, da das Programm dort
1142 root 1.6 abstürzt, wo die Daten verarbeitet werden sollen, was meistens
1143     Rückschlüsse auf die Art der Daten zuläßt :)
1144    
1145     Ansonsten bleibt nur, das Ergebnis zu liefern:
1146    
1147     $self->{result}
1148     }
1149    
1150     Fertig!
1151    
1152 root 1.5
1153