--- AnyEvent/lib/AnyEvent.pm 2008/04/22 05:12:19 1.54 +++ AnyEvent/lib/AnyEvent.pm 2011/08/13 02:35:32 1.358 @@ -1,24 +1,60 @@ =head1 NAME -AnyEvent - provide framework for multiple event loops +AnyEvent - the DBI of event loop programming -EV, Event, Coro::EV, Coro::Event, Glib, Tk, Perl - various supported event loops +EV, Event, Glib, Tk, Perl, Event::Lib, Irssi, rxvt-unicode, IO::Async, Qt +and POE are various supported event loops/environments. =head1 SYNOPSIS use AnyEvent; - my $w = AnyEvent->io (fh => $fh, poll => "r|w", cb => sub { - ... - }); + # if you prefer function calls, look at the AE manpage for + # an alternative API. + + # file handle or descriptor readable + my $w = AnyEvent->io (fh => $fh, poll => "r", cb => sub { ... }); + + # one-shot or repeating timers + my $w = AnyEvent->timer (after => $seconds, cb => sub { ... }); + my $w = AnyEvent->timer (after => $seconds, interval => $seconds, cb => ...); + + print AnyEvent->now; # prints current event loop time + print AnyEvent->time; # think Time::HiRes::time or simply CORE::time. - my $w = AnyEvent->timer (after => $seconds, cb => sub { + # POSIX signal + my $w = AnyEvent->signal (signal => "TERM", cb => sub { ... }); + + # child process exit + my $w = AnyEvent->child (pid => $pid, cb => sub { + my ($pid, $status) = @_; ... }); + # called when event loop idle (if applicable) + my $w = AnyEvent->idle (cb => sub { ... }); + my $w = AnyEvent->condvar; # stores whether a condition was flagged - $w->wait; # enters "main loop" till $condvar gets ->broadcast - $w->broadcast; # wake up current and all future wait's + $w->send; # wake up current and all future recv's + $w->recv; # enters "main loop" till $condvar gets ->send + # use a condvar in callback mode: + $w->cb (sub { $_[0]->recv }); + +=head1 INTRODUCTION/TUTORIAL + +This manpage is mainly a reference manual. If you are interested +in a tutorial or some gentle introduction, have a look at the +L manpage. + +=head1 SUPPORT + +An FAQ document is available as L. + +There also is a mailinglist for discussing all things AnyEvent, and an IRC +channel, too. + +See the AnyEvent project page at the B, at L, for more info. =head1 WHY YOU SHOULD USE THIS MODULE (OR NOT) @@ -29,11 +65,12 @@ policy> and AnyEvent is I. First and foremost, I itself, it only -interfaces to whatever event model the main program happens to use in a +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. +cannot change this, but it can hide 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 @@ -43,50 +80,55 @@ 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. +like joining a cult: After you join, you are dependent on them and you +cannot use anything else, as they are simply incompatible to everything +that isn't them. 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). +with the rest: POE + EV? 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 IO::Async, as long as those use one of the +supported event loops. It is easy 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 enourmous amount of code and strict rules you have to -follow. AnyEvent, on the other hand, is lean and up to the point, by only +modules, you get an enormous amount of code and strict rules you have to +follow. AnyEvent, on the other hand, is lean and to the point, by only offering the functionality that is necessary, in as thin as a wrapper as technically possible. -Of course, if you want lots of policy (this can arguably be somewhat +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). +L provides a uniform interface to various event loops. This +allows module authors to use event loop functionality without forcing +module users to use a specific event loop implementation (since more +than one event loop cannot coexist peacefully). 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. The first one found is used. If none are found, -the module tries to load these modules in the stated order. 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. +following modules is already loaded: L, L, +L, L, L, L, L, L. The first one +found is used. If none are detected, the module tries to load the first +four modules in the order given; but note that if L is not +available, the pure-perl L should always work, so +the other two are not normally tried. Because AnyEvent first checks for modules that are already loaded, loading an event model explicitly before first using AnyEvent will likely make @@ -98,25 +140,32 @@ # .. 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. +starts using it, all bets are off - this case should be very rare though, +as very few modules hardcode event loops without announcing this very +loudly. + +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 filehandle to watch, etc. +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 +Note that B +potentially in use by the event loop (such as C<$_> or C<$[>) and that B<< +callbacks must not C >>. The former is good programming practice in +Perl and the latter stems from the fact that exception handling differs +widely between event loops. + +To disable a 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). @@ -125,41 +174,55 @@ 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: +One 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; - }); + 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 IO WATCHERS +=head2 I/O WATCHERS + + $w = AnyEvent->io ( + fh => , + poll => <"r" or "w">, + cb => , + ); 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. +C is the Perl I (or a naked file descriptor) to watch +for events (AnyEvent might or might not keep a reference to this file +handle). Note that only file handles pointing to things for which +non-blocking operation makes sense are allowed. This includes sockets, +most character devices, pipes, fifos and so on, but not for example files +or block devices. + +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. -File handles will be kept alive, so as long as the watcher exists, the -file handle exists, too. - -It is not allowed to 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 +Some event loops issue spurious readiness notifications, so you should always use non-blocking calls when reading/writing from/to your file handles. -Example: +Example: wait for readability of STDIN, then read a line and disable the +watcher. - # 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"; @@ -168,20 +231,37 @@ =head2 TIME WATCHERS + $w = AnyEvent->timer (after => , cb => ); + + $w = AnyEvent->timer ( + after => , + interval => , + cb => , + ); + 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) should the timer activate. C the callback to invoke in that -case. +supported) the callback should be invoked. C is the callback to invoke +in that case. -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). +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 callback will normally be invoked only once. If you specify another +parameter, C, as a strictly positive number (> 0), then the +callback will be invoked regularly at that interval (in fractional +seconds) after the first invocation. If C is specified with a +false value, then it is treated as if it were not specified at all. + +The callback will be rescheduled before invoking the callback, but no +attempt is made to avoid timer drift in most backends, so the interval is +only approximate. -Example: +Example: fire an event after 7.7 seconds. - # fire an event after 7.7 seconds my $w = AnyEvent->timer (after => 7.7, cb => sub { warn "timeout\n"; }); @@ -189,184 +269,783 @@ # to cancel the timer: undef $w; -Example 2: - - # fire an event after 0.5 seconds, then roughly every second - my $w; +Example 2: fire an event after 0.5 seconds, then roughly every second. - my $cb = sub { - # cancel the old timer while creating a new one - $w = AnyEvent->timer (after => 1, cb => $cb); + my $w = AnyEvent->timer (after => 0.5, interval => 1, cb => sub { + warn "timeout\n"; }; - # 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 2014-01-01 to -2008-01-01, a watcher that you created to fire "after" a second might actually take -six years to finally fire. +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) and -absolute (ev_periodic) timers. +of 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