--- AnyEvent/lib/AnyEvent.pm 2008/04/25 09:08:16 1.79 +++ AnyEvent/lib/AnyEvent.pm 2008/04/25 13:48:42 1.84 @@ -82,9 +82,9 @@ 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, 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 Event::Lib, Qt and POE as the pure perl +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 @@ -149,16 +149,18 @@ respectively. C is the callback to invoke each time the file handle becomes ready. -As long as the I/O watcher exists it will keep the file descriptor or a -copy of it alive/open. - -It is not allowed to close a file handle as long as any watcher is active -on the underlying file descriptor. +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. +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. + Example: # wait for readability of STDIN, then read a line and disable the watcher @@ -181,6 +183,10 @@ 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. + Example: # fire an event after 7.7 seconds @@ -255,16 +261,38 @@ signal handler for C. The callback will be called with the pid and exit status (as returned by waitpid). -Example: wait for pid 1333 +There is a slight catch to child watchers, however: you usually start them +I the child process was created, and this means the process could +have exited already (and no SIGCHLD will be sent anymore). + +Not all event models handle this correctly (POE doesn't), but even for +event models that I handle this correctly, they usually need to be +loaded before the process exits (i.e. before you fork in the first place). + +This means you cannot create a child watcher as the very first thing in an +AnyEvent program, you I to create at least one watcher before you +C the child (alternatively, you can call C). + +Example: fork a process and wait for it + + my $done = AnyEvent->condvar; + + AnyEvent::detect; # force event module to be initialised + + my $pid = fork or exit 5; my $w = AnyEvent->child ( - pid => 1333, + pid => $pid, cb => sub { my ($pid, $status) = @_; warn "pid $pid exited with status $status"; + $done->broadcast; }, ); + # do something else, then wait for process exit + $done->wait; + =head2 CONDITION VARIABLES Condition variables can be created by calling the C<< AnyEvent->condvar >> @@ -361,8 +389,8 @@ AnyEvent::Impl::EV based on EV (an interface to libev, best choice). AnyEvent::Impl::Event based on Event, second best choice. AnyEvent::Impl::Glib based on Glib, third-best choice. - AnyEvent::Impl::Tk based on Tk, very bad choice. AnyEvent::Impl::Perl pure-perl implementation, inefficient but portable. + AnyEvent::Impl::Tk based on Tk, very bad choice. AnyEvent::Impl::Qt based on Qt, cannot be autoprobed (see its docs). AnyEvent::Impl::EventLib based on Event::Lib, leaks memory and worse. AnyEvent::Impl::POE based on POE, not generic enough for full support. @@ -908,30 +936,29 @@ name watchers bytes create invoke destroy comment EV/EV 400000 244 0.56 0.46 0.31 EV native interface - EV/Any 100000 610 3.52 0.91 0.75 EV + AnyEvent watchers - CoroEV/Any 100000 610 3.49 0.92 0.75 coroutines + Coro::Signal - Perl/Any 100000 513 4.91 0.92 1.15 pure perl implementation - Event/Event 16000 523 28.05 21.38 0.86 Event native interface - Event/Any 16000 943 34.43 20.48 1.39 Event + AnyEvent watchers - Glib/Any 16000 1357 96.99 12.55 55.51 quadratic behaviour - Tk/Any 2000 1855 27.01 66.61 14.03 SEGV with >> 2000 watchers - POE/Event 2000 6644 108.15 768.19 14.33 via POE::Loop::Event - POE/Select 2000 6343 94.69 807.65 562.69 via POE::Loop::Select + 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 936 39.17 33.63 1.43 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 =head2 Discussion The benchmark does I measure scalability of the event loop very well. For example, a select-based event loop (such as the pure perl one) can never compete with an event loop that uses epoll when the number of -file descriptors grows high. In this benchmark, only a single filehandle -is used (although some of the AnyEvent adaptors dup() its file descriptor -to worka round bugs). +file descriptors grows high. In this benchmark, all events become ready at +the same time, so select/poll-based implementations get an unnatural speed +boost. C is the sole leader regarding speed and memory use, which are both -maximal/minimal, respectively. Even when going through AnyEvent, there are -only two event loops that use slightly less memory (the C module -natively and the pure perl backend), and no faster event models, not even -C natively. +maximal/minimal, respectively. Even when going through AnyEvent, it uses +far less memory than any other event loop and is still faster than Event +natively. The pure perl implementation is hit in a few sweet spots (both the zero timeout and the use of a single fd hit optimisations in the perl