%include "std.mgp" %default 1 bimage "papp2.png" 1024x768, center %page AnyEvent - Eine Welt ohne Religion %page Worum geht es? %pause Religion?? %pause Event-Modelle sind wie Religionen %pause Tk-Module laufen nur mit Tk, Gtk-Module nur mit Gtk, ... %pause main Gtk %pause MainLoop # Tk %pause Event::loop, EV::loop %pause run POE::Kernel %pause Benutzung in Modulen == Festlegung auf ein Modell %pause AnyEvent ist anders! %page AnyEvent am Beispiel AnyEvent::CouchDB Eine einzelne Datenbankabfrage: %pause %font "t4" my $data = $db->view('users/all', { key => 'b' })->recv; %font "s" %pause Parallele Abfragen: %font "t4" my @data = map $_->recv, map $db->view ('users/al', { key => $_ }), qw(key1 key2 key3 key4); %font "s" %pause Keine Abhängigkeit von einem Event-Modell! %page AnyEvent "The Works" Alte Bekannte: %font "t3" my $timer = AnyEvent->timer (after => 7, cb => sub { warn "Sieben Sekunden sind abgelaufen!"; }); %pause my $watcher = AnyEvent->io (fh => *STDIN, poll => 'r', cb => sub { my $line = ; }); %pause my $term = AnyEvent->signal (signal => "TERM", cb => sub { $quit->send; }); %pause my $w = AnyEvent->child (pid => $pid, cb => sub { warn "pid $pid hat sich beendet\\n"; }); %page Neues in AnyEvent! %pause Zuerst, was ist gleich geblieben? %pause API 100% rückwärtskompatibel %pause 100% "Pure-Perl" %pause Keine festen Abhängigkeiten %pause Separates Event-Modul Wirklich neues: %pause AnyEvent::Strict %pause Ok, nicht soooo überzeugend... %page AnyEvent::Socket Verbindungen Aufbauen %pause %font "t4" tcp_connect "www.google.com", "80", sub { my ($fh) = @_ or die "www.google.com: $!"; ... }; %pause tcp_connect "jabber.org", "xmpp-server=5269", sub { # Die pseudo-XML-Kacke parsed ihr bitte selbst... }, 60; # <- timeout %pause tcp_connect "unix/", "/tmp/.X11-unix/X0", sub { ... %font "s" %page AnyEvent::Socket Verbindungen Annehmen %font "t4" tcp_server "::", 80, sub { my ($fh, $host, $port) = @_; # jede neue Verbindung führt zu einem Aufruf dieses Callbacks }; %pause tcp_server "0", undef, sub { my ($fh, $host, $port) = @_; ... }, sub { my ($thishost, $thisport) = @_; warn "bound to port $thisport\\n"; }; %font "s" %page AnyEvent::DNS %pause 100% non-blocking DNS-Stub-Resolver %pause anders als z.B. adns %pause ca. halb so schnell wie EV::ADNS. %pause IPv6, EDNS0, VC-mode etc. %page AnyEvent::Handle Beispiel HTTPS-Client %font "t3" tcp_connect "www.google.com", "443", sub { my ($fh) = @_ or die; my $hdl; $hdl = new AnyEvent::Handle fh => $fh, timeout => 60, %pause tls => "connect", %pause on_eof => sub { undef $hdl; $cv->send }, on_read => sub { my ($hdl) = @_; print $hdl->{rbuf}; $hdl->{rbuf} = "" }; %pause $hdl->push_write ("GET / HTTP/1.0\\015\\012\\015\\012"); }; %page AnyEvent::Handle Formatted I/O %font "t4" %pause $hdl->push_write ("GET / HTTP/1.0\\015\\012\\015\\012"); %pause $hdl->push_write (netstring => "xyz"); $hdl->push_write (packstring => "w", "data"); $hdl->push_write (json => [1, 2, 3, 4]); $hdl->push_write (storable => $ref); %pause $hdl->push_read (json => sub { my $data = $_[1] }); $hdl->push_read (line => $eol, $cb); $hdl->push_read (regex => $accept[, $reject[, $skip], $cb); %pause $hdl->unshift_read (json => sub { my $data = $_[1] }); %page AnyEvent::Handle Pipelining %font "t4" for (@uris) { %pause $hdl->push_write ("GET $_ HTTP/1.0\\015\\012\\015\\012"); %pause $hdl->push_read (line => "\\015\\012\\015\\012", sub { my ($hdl, $header) = @_; my $content_length = extract "Content-Length", $header; %pause $hdl->unshift_read (chunk => $content_length, sub { my ($hdl, $body) = @_; # fertig %page Benchmarks Wie viel kostet AnyEvent selbst? %pause Watcher: Anzahl der erzeugten Watcher-Objekte. %pause Bytes: RAM-Größe/Watcher (C plus Perl). %pause Create: Watcher-Erzeugung, in µs. %pause Invoke: Watcher-Ausführung, in µs. %pause Destroy: Freigeben eines Watchers, in µs. %page Benchmarks Overhead von AnyEvent %font "t4" %xfont "b&h-lucidatypewriter" Name Watcher Bytes Create Invoke Destroy EV/EV 400000 224 0.47 0.35 0.27 %pause EV/Any 100000 224 2.88 0.34 0.27 %pause Perl/Any 100000 452 4.13 0.73 0.95 %pause Event/Event 16000 517 32.20 31.80 0.81 %pause Event/Any 16000 590 35.85 31.55 1.06 %pause Glib/Any 16000 1357 102.33 12.31 51.00 %pause Tk/Any 2000 1860 27.20 66.31 14.00 %pause POE/Event 2000 6328 109.99 751.67 14.02 %page Benchmarks Big Server %pause 10000 Socketpaare, 100 aktiv %pause Create: Erzeugung einer "Verbindung" %pause Request: ein einzelner "Request" %pause %font "t5" %xfont "b&h-lucidatypewriter" Name Create Request EV 69.01 11.16 %pause Perl 73.32 35.87 %pause Event 212.62 257.32 %pause Glib 651.16 1896.30 %pause POE 349.67 12317.24 (Event) %pause %font "t2" (Tagungsband: 8/3) %page AnyEvent Ausblick auf CPAN %pause AnyEvent::HTTP %pause AnyEvent::AIO %pause AnyEvent::DBI %pause AnyEvent::CouchDB %pause AnyEvent::BDB %pause AnyEvent::IRC %pause AnyEvent::XMPP %pause AnyEvent::FastPing %pause AnyEvent::HTTPD %pause Coro::AnyEvent %pause %font "t2" Nicht-AnyEvent-Namespace %page Fragen?