--- AnyEvent/lib/AnyEvent.pm 2005/04/27 01:26:44 1.1 +++ AnyEvent/lib/AnyEvent.pm 2008/05/29 00:14:35 1.144 @@ -1,52 +1,1695 @@ -=head1 NAME +=head1 => NAME -AnyEvent - ??? +AnyEvent - provide framework for multiple event loops + +EV, Event, Glib, Tk, Perl, Event::Lib, Qt, POE - various supported event loops =head1 SYNOPSIS + use AnyEvent; + + my $w = AnyEvent->io (fh => $fh, poll => "r|w", cb => sub { + ... + }); + + my $w = AnyEvent->timer (after => $seconds, cb => sub { + ... + }); + + my $w = AnyEvent->condvar; # stores whether a condition was flagged + $w->send; # wake up current and all future recv's + $w->recv; # enters "main loop" till $condvar gets ->send + +=head1 WHY YOU SHOULD USE THIS MODULE (OR NOT) + +Glib, POE, IO::Async, Event... CPAN offers event models by the dozen +nowadays. So what is different about AnyEvent? + +Executive Summary: AnyEvent is I, AnyEvent is I and AnyEvent is I. + +First and foremost, I itself, it only +interfaces to whatever event model the main program happens to use in a +pragmatic way. For event models and certain classes of immortals alike, +the statement "there can only be one" is a bitter reality: In general, +only one event loop can be active at the same time in a process. AnyEvent +helps hiding the differences between those event loops. + +The goal of AnyEvent is to offer module authors the ability to do event +programming (waiting for I/O or timer events) without subscribing to a +religion, a way of living, and most importantly: without forcing your +module users into the same thing by forcing them to use the same event +model you use. + +For modules like POE or IO::Async (which is a total misnomer as it is +actually doing all I/O I...), using them in your module is +like joining a cult: After you joined, you are dependent on them and you +cannot use anything else, as it is simply incompatible to everything that +isn't itself. What's worse, all the potential users of your module are +I forced to use the same event loop you use. + +AnyEvent is different: AnyEvent + POE works fine. AnyEvent + Glib works +fine. AnyEvent + Tk works fine etc. etc. but none of these work together +with the rest: POE + IO::Async? No go. Tk + Event? No go. Again: if +your module uses one of those, every user of your module has to use it, +too. But if your module uses AnyEvent, it works transparently with all +event models it supports (including stuff like POE and IO::Async, as long +as those use one of the supported event loops. It is trivial to add new +event loops to AnyEvent, too, so it is future-proof). + +In addition to being free of having to use I, AnyEvent also is free of bloat and policy: with POE or similar +modules, you get an enormous amount of code and strict rules you have to +follow. AnyEvent, on the other hand, is lean and up to the point, by only +offering the functionality that is necessary, in as thin as a wrapper as +technically possible. + +Of course, AnyEvent comes with a big (and fully optional!) toolbox +of useful functionality, such as an asynchronous DNS resolver, 100% +non-blocking connects (even with TLS/SSL, IPv6 and on broken platforms +such as Windows) and lots of real-world knowledge and workarounds for +platform bugs and differences. + +Now, if you I lots of policy (this can arguably be somewhat +useful) and you want to force your users to use the one and only event +model, you should I use this module. + =head1 DESCRIPTION +L provides an identical interface to multiple event loops. This +allows module authors to utilise an event loop without forcing module +users to use the same event loop (as only a single event loop can coexist +peacefully at any one time). + +The interface itself is vaguely similar, but not identical to the L +module. + +During the first call of any watcher-creation method, the module tries +to detect the currently loaded event loop by probing whether one of the +following modules is already loaded: L, +L, L, L, L, L, L, +L. The first one found is used. If none are found, the module tries +to load these modules (excluding Tk, Event::Lib, Qt and POE as the pure perl +adaptor should always succeed) in the order given. The first one that can +be successfully loaded will be used. If, after this, still none could be +found, AnyEvent will fall back to a pure-perl event loop, which is not +very efficient, but should work everywhere. + +Because AnyEvent first checks for modules that are already loaded, loading +an event model explicitly before first using AnyEvent will likely make +that model the default. For example: + + use Tk; + use AnyEvent; + + # .. AnyEvent will likely default to Tk + +The I means that, if any module loads another event model and +starts using it, all bets are off. Maybe you should tell their authors to +use AnyEvent so their modules work together with others seamlessly... + +The pure-perl implementation of AnyEvent is called +C. Like other event modules you can load it +explicitly and enjoy the high availability of that event loop :) + +=head1 WATCHERS + +AnyEvent has the central concept of a I, which is an object that +stores relevant data for each kind of event you are waiting for, such as +the callback to call, the file handle to watch, etc. + +These watchers are normal Perl objects with normal Perl lifetime. After +creating a watcher it will immediately "watch" for events and invoke the +callback when the event occurs (of course, only when the event model +is in control). + +To disable the watcher you have to destroy it (e.g. by setting the +variable you store it in to C or otherwise deleting all references +to it). + +All watchers are created by calling a method on the C class. + +Many watchers either are used with "recursion" (repeating timers for +example), or need to refer to their watcher object in other ways. + +An any way to achieve that is this pattern: + + my $w; $w = AnyEvent->type (arg => value ..., cb => sub { + # you can use $w here, for example to undef it + undef $w; + }); + +Note that C combination. This is necessary because in Perl, +my variables are only visible after the statement in which they are +declared. + +=head2 I/O WATCHERS + +You can create an I/O watcher by calling the C<< AnyEvent->io >> method +with the following mandatory key-value pairs as arguments: + +C the Perl I (I file descriptor) to watch +for events. C must be a string that is either C or C, +which creates a watcher waiting for "r"eadable or "w"ritable events, +respectively. C is the callback to invoke each time the file handle +becomes ready. + +Although the callback might get passed parameters, their value and +presence is undefined and you cannot rely on them. Portable AnyEvent +callbacks cannot use arguments passed to I/O watcher callbacks. + +The I/O watcher might use the underlying file descriptor or a copy of it. +You must not close a file handle as long as any watcher is active on the +underlying file descriptor. + +Some event loops issue spurious readyness notifications, so you should +always use non-blocking calls when reading/writing from/to your file +handles. + +Example: + + # wait for readability of STDIN, then read a line and disable the watcher + my $w; $w = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub { + chomp (my $input = ); + warn "read: $input\n"; + undef $w; + }); + +=head2 TIME WATCHERS + +You can create a time watcher by calling the C<< AnyEvent->timer >> +method with the following mandatory arguments: + +C specifies after how many seconds (fractional values are +supported) the callback should be invoked. C is the callback to invoke +in that case. + +Although the callback might get passed parameters, their value and +presence is undefined and you cannot rely on them. Portable AnyEvent +callbacks cannot use arguments passed to time watcher callbacks. + +The timer callback will be invoked at most once: if you want a repeating +timer you have to create a new watcher (this is a limitation by both Tk +and Glib). + +Example: + + # fire an event after 7.7 seconds + my $w = AnyEvent->timer (after => 7.7, cb => sub { + warn "timeout\n"; + }); + + # to cancel the timer: + undef $w; + +Example 2: + + # fire an event after 0.5 seconds, then roughly every second + my $w; + + my $cb = sub { + # cancel the old timer while creating a new one + $w = AnyEvent->timer (after => 1, cb => $cb); + }; + + # start the "loop" by creating the first watcher + $w = AnyEvent->timer (after => 0.5, cb => $cb); + +=head3 TIMING ISSUES + +There are two ways to handle timers: based on real time (relative, "fire +in 10 seconds") and based on wallclock time (absolute, "fire at 12 +o'clock"). + +While most event loops expect timers to specified in a relative way, they +use absolute time internally. This makes a difference when your clock +"jumps", for example, when ntp decides to set your clock backwards from +the wrong date of 2014-01-01 to 2008-01-01, a watcher that is supposed to +fire "after" a second might actually take six years to finally fire. + +AnyEvent cannot compensate for this. The only event loop that is conscious +about these issues is L, which offers both relative (ev_timer, based +on true relative time) and absolute (ev_periodic, based on wallclock time) +timers. + +AnyEvent always prefers relative timers, if available, matching the +AnyEvent API. + +AnyEvent has two additional methods that return the "current time": + =over 4 +=item AnyEvent->time + +This returns the "current wallclock time" as a fractional number of +seconds since the Epoch (the same thing as C