--- AnyEvent/README 2008/07/29 10:20:33 1.29 +++ AnyEvent/README 2009/04/26 18:12:53 1.38 @@ -7,21 +7,28 @@ SYNOPSIS use AnyEvent; - my $w = AnyEvent->io (fh => $fh, poll => "r|w", cb => sub { ... }); + # file 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. + # 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->send; # wake up current and all future recv's $w->recv; # enters "main loop" till $condvar gets ->send @@ -134,6 +141,12 @@ callback when the event occurs (of course, only when the event model is in control). + Note that callbacks must not permanently change global variables + potentially in use by the event loop (such as $_ or $[) and that + callbacks must not "die". The former is good programming practise in + Perl and the latter stems from the fact that exception handling differs + widely between event loops. + To disable the watcher you have to destroy it (e.g. by setting the variable you store it in to "undef" or otherwise deleting all references to it). @@ -158,11 +171,17 @@ You can create an I/O watcher by calling the "AnyEvent->io" method with the following mandatory key-value pairs as arguments: - "fh" the Perl *file handle* (*not* file descriptor) to watch for events - (AnyEvent might or might not keep a reference to this file handle). + "fh" is the Perl *file handle* (*not* 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. + "poll" must be a string that is either "r" or "w", which creates a - watcher waiting for "r"eadable or "w"ritable events, respectively. "cb" - is the callback to invoke each time the file handle becomes ready. + watcher waiting for "r"eadable or "w"ritable events, respectively. + + "cb" 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 @@ -304,6 +323,20 @@ the difference between "AnyEvent->time" and "AnyEvent->now" into account. + AnyEvent->now_update + Some event loops (such as EV or AnyEvent::Impl::Perl) cache the + current time for each loop iteration (see the discussion of + AnyEvent->now, above). + + When a callback runs for a long time (or when the process sleeps), + then this "current" time will differ substantially from the real + time, which might affect timers and time-outs. + + When this is the case, you can call this method, which will update + the event loop's idea of "current time". + + Note that updating the time *might* cause some events to be handled. + SIGNAL WATCHERS You can watch for signals using a signal watcher, "signal" is the signal *name* in uppercase and without any "SIG" prefix, "cb" is the Perl @@ -332,11 +365,18 @@ You can also watch on a child process exit and catch its exit status. The child process is specified by the "pid" argument (if set to 0, it - watches for any child process exit). The watcher will trigger as often - as status change for the child are received. This works by installing a - signal handler for "SIGCHLD". The callback will be called with the pid - and exit status (as returned by waitpid), so unlike other watcher types, - you *can* rely on child watcher callback arguments. + watches for any child process exit). The watcher will triggered only + when the child process has finished and an exit status is available, not + on any trace events (stopped/continued). + + The callback will be called with the pid and exit status (as returned by + waitpid), so unlike other watcher types, you *can* rely on child watcher + callback arguments. + + This watcher type works by installing a signal handler for "SIGCHLD", + and since it cannot be shared, nothing else should use SIGCHLD or reap + random child processes (waiting for specific child processes, e.g. + inside "system", is just fine). There is a slight catch to child watchers, however: you usually start them *after* the child process was created, and this means the process @@ -369,6 +409,40 @@ # do something else, then wait for process exit $done->recv; + IDLE WATCHERS + Sometimes there is a need to do something, but it is not so important to + do it instantly, but only when there is nothing better to do. This + "nothing better to do" is usually defined to be "no other events need + attention by the event loop". + + Idle watchers ideally get invoked when the event loop has nothing better + to do, just before it would block the process to wait for new events. + Instead of blocking, the idle watcher is invoked. + + Most event loops unfortunately do not really support idle watchers (only + EV, Event and Glib do it in a usable fashion) - for the rest, AnyEvent + will simply call the callback "from time to time". + + Example: read lines from STDIN, but only process them when the program + is otherwise idle: + + my @lines; # read data + my $idle_w; + my $io_w = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub { + push @lines, scalar ; + + # start an idle watcher, if not already done + $idle_w ||= AnyEvent->idle (cb => sub { + # handle only one line, when there are lines left + if (my $line = shift @lines) { + print "handled when idle: $line"; + } else { + # otherwise disable the idle watcher again + undef $idle_w; + } + }); + }); + CONDITION VARIABLES If you are familiar with some event loops you will know that all of them require you to run some blocking "loop", "run" or similar function that @@ -772,8 +846,9 @@ A non-blocking interface to the Internet Go Server protocol (used by App::IGS). - Net::IRC3 - AnyEvent based IRC client module family. + AnyEvent::IRC + AnyEvent based IRC client module family (replacing the older + Net::IRC3). Net::XMPP2 AnyEvent based XMPP (Jabber protocol) module family. @@ -792,51 +867,25 @@ The lambda approach to I/O - don't ask, look there. Can use AnyEvent. -SUPPLYING YOUR OWN EVENT MODEL INTERFACE - This is an advanced topic that you do not normally need to use AnyEvent - in a module. This section is only of use to event loop authors who want - to provide AnyEvent compatibility. - - If you need to support another event library which isn't directly - supported by AnyEvent, you can supply your own interface to it by - pushing, before the first watcher gets created, the package name of the - event module and the package name of the interface to use onto - @AnyEvent::REGISTRY. You can do that before and even without loading - AnyEvent, so it is reasonably cheap. - - Example: - - push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::]; - - This tells AnyEvent to (literally) use the "urxvt::anyevent::" - package/class when it finds the "urxvt" package/module is already - loaded. - - When AnyEvent is loaded and asked to find a suitable event model, it - will first check for the presence of urxvt by trying to "use" the - "urxvt::anyevent" module. - - The class should provide implementations for all watcher types. See - AnyEvent::Impl::EV (source code), AnyEvent::Impl::Glib (Source code) and - so on for actual examples. Use "perldoc -m AnyEvent::Impl::Glib" to see - the sources. - - If you don't provide "signal" and "child" watchers than AnyEvent will - provide suitable (hopefully) replacements. - - The above example isn't fictitious, the *rxvt-unicode* (a.k.a. urxvt) - terminal emulator uses the above line as-is. An interface isn't included - in AnyEvent because it doesn't make sense outside the embedded - interpreter inside *rxvt-unicode*, and it is updated and maintained as - part of the *rxvt-unicode* distribution. - - *rxvt-unicode* also cheats a bit by not providing blocking access to - condition variables: code blocking while waiting for a condition will - "die". This still works with most modules/usages, and blocking calls - must not be done in an interactive application, so it makes sense. +ERROR AND EXCEPTION HANDLING + In general, AnyEvent does not do any error handling - it relies on the + caller to do that if required. The AnyEvent::Strict module (see also the + "PERL_ANYEVENT_STRICT" environment variable, below) provides strict + checking of all AnyEvent methods, however, which is highly useful during + development. + + As for exception handling (i.e. runtime errors and exceptions thrown + while executing a callback), this is not only highly event-loop + specific, but also not in any way wrapped by this module, as this is the + job of the main program. + + The pure perl event loop simply re-throws the exception (usually within + "condvar->recv"), the Event and EV modules call "$Event/EV::DIED->()", + Glib uses "install_exception_handler" and so on. ENVIRONMENT VARIABLES - The following environment variables are used by this module: + The following environment variables are used by this module or its + submodules: "PERL_ANYEVENT_VERBOSE" By default, AnyEvent will be completely silent except in fatal @@ -859,8 +908,9 @@ In other words, enables "strict" mode. - Unlike "use strict" it is definitely recommended ot keep it off in - production. + Unlike "use strict", it is definitely recommended ot keep it off in + production. Keeping "PERL_ANYEVENT_STRICT=1" in your environment + while developing programs can be very useful, however. "PERL_ANYEVENT_MODEL" This can be used to specify the event model to be used by AnyEvent, @@ -889,8 +939,8 @@ This variable can effectively be used for denial-of-service attacks against local programs (e.g. when setuid), although the impact is - likely small, as the program has to handle connection errors - already- + likely small, as the program has to handle conenction and other + failures anyways. Examples: "PERL_ANYEVENT_PROTOCOLS=ipv4,ipv6" - prefer IPv4 over IPv6, but support both and try to use both. @@ -912,6 +962,49 @@ The maximum number of child processes that "AnyEvent::Util::fork_call" will create in parallel. +SUPPLYING YOUR OWN EVENT MODEL INTERFACE + This is an advanced topic that you do not normally need to use AnyEvent + in a module. This section is only of use to event loop authors who want + to provide AnyEvent compatibility. + + If you need to support another event library which isn't directly + supported by AnyEvent, you can supply your own interface to it by + pushing, before the first watcher gets created, the package name of the + event module and the package name of the interface to use onto + @AnyEvent::REGISTRY. You can do that before and even without loading + AnyEvent, so it is reasonably cheap. + + Example: + + push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::]; + + This tells AnyEvent to (literally) use the "urxvt::anyevent::" + package/class when it finds the "urxvt" package/module is already + loaded. + + When AnyEvent is loaded and asked to find a suitable event model, it + will first check for the presence of urxvt by trying to "use" the + "urxvt::anyevent" module. + + The class should provide implementations for all watcher types. See + AnyEvent::Impl::EV (source code), AnyEvent::Impl::Glib (Source code) and + so on for actual examples. Use "perldoc -m AnyEvent::Impl::Glib" to see + the sources. + + If you don't provide "signal" and "child" watchers than AnyEvent will + provide suitable (hopefully) replacements. + + The above example isn't fictitious, the *rxvt-unicode* (a.k.a. urxvt) + terminal emulator uses the above line as-is. An interface isn't included + in AnyEvent because it doesn't make sense outside the embedded + interpreter inside *rxvt-unicode*, and it is updated and maintained as + part of the *rxvt-unicode* distribution. + + *rxvt-unicode* also cheats a bit by not providing blocking access to + condition variables: code blocking while waiting for a condition will + "die". This still works with most modules/usages, and blocking calls + must not be done in an interactive application, so it makes sense. + EXAMPLE PROGRAM The following program uses an I/O watcher to read data from STDIN, a timer to display a message once per second, and a condition variable to @@ -1107,16 +1200,16 @@ Results name watchers bytes create invoke destroy comment - EV/EV 400000 244 0.56 0.46 0.31 EV native interface - EV/Any 100000 244 2.50 0.46 0.29 EV + AnyEvent watchers - CoroEV/Any 100000 244 2.49 0.44 0.29 coroutines + Coro::Signal - Perl/Any 100000 513 4.92 0.87 1.12 pure perl implementation - Event/Event 16000 516 31.88 31.30 0.85 Event native interface - Event/Any 16000 590 35.75 31.42 1.08 Event + AnyEvent watchers - Glib/Any 16000 1357 98.22 12.41 54.00 quadratic behaviour - Tk/Any 2000 1860 26.97 67.98 14.00 SEGV with >> 2000 watchers - POE/Event 2000 6644 108.64 736.02 14.73 via POE::Loop::Event - POE/Select 2000 6343 94.13 809.12 565.96 via POE::Loop::Select + EV/EV 400000 224 0.47 0.35 0.27 EV native interface + EV/Any 100000 224 2.88 0.34 0.27 EV + AnyEvent watchers + CoroEV/Any 100000 224 2.85 0.35 0.28 coroutines + Coro::Signal + Perl/Any 100000 452 4.13 0.73 0.95 pure perl implementation + Event/Event 16000 517 32.20 31.80 0.81 Event native interface + Event/Any 16000 590 35.85 31.55 1.06 Event + AnyEvent watchers + Glib/Any 16000 1357 102.33 12.31 51.00 quadratic behaviour + Tk/Any 2000 1860 27.20 66.31 14.00 SEGV with >> 2000 watchers + POE/Event 2000 6328 109.99 751.67 14.02 via POE::Loop::Event + POE/Select 2000 6027 94.54 809.13 579.80 via POE::Loop::Select Discussion The benchmark does *not* measure scalability of the event loop very @@ -1307,6 +1400,30 @@ * C-based event loops perform very well with small number of watchers, as the management overhead dominates. +SIGNALS + AnyEvent currently installs handlers for these signals: + + SIGCHLD + A handler for "SIGCHLD" is installed by AnyEvent's child watcher + emulation for event loops that do not support them natively. Also, + some event loops install a similar handler. + + SIGPIPE + A no-op handler is installed for "SIGPIPE" when $SIG{PIPE} is + "undef" when AnyEvent gets loaded. + + The rationale for this is that AnyEvent users usually do not really + depend on SIGPIPE delivery (which is purely an optimisation for + shell use, or badly-written programs), but "SIGPIPE" can cause + spurious and rare program exits as a lot of people do not expect + "SIGPIPE" when writing to some random socket. + + The rationale for installing a no-op handler as opposed to ignoring + it is that this way, the handler will be restored to defaults on + exec. + + Feel free to install your own handler, or reset it to defaults. + FORK Most event libraries are not fork-safe. The ones who are usually are because they rely on inefficient but fork-safe "select" or "poll" calls. @@ -1339,7 +1456,7 @@ Perl 5.8 has numerous memleaks that sometimes hit this module and are hard to work around. If you suffer from memleaks, first upgrade to Perl 5.10 and check wether the leaks still show up. (Perl 5.10.0 has other - annoying mamleaks, such as leaking on "map" and "grep" but it is usually + annoying memleaks, such as leaking on "map" and "grep" but it is usually not as pronounced). SEE ALSO