ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/README
Revision: 1.17
Committed: Tue Apr 22 05:12:19 2008 UTC (16 years ago) by root
Branch: MAIN
CVS Tags: rel-3_12
Changes since 1.16: +3 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.2 NAME
2     AnyEvent - provide framework for multiple event loops
3    
4 root 1.15 EV, Event, Coro::EV, Coro::Event, Glib, Tk, Perl - various supported
5     event loops
6 root 1.2
7     SYNOPSIS
8 root 1.4 use AnyEvent;
9 root 1.2
10 root 1.6 my $w = AnyEvent->io (fh => $fh, poll => "r|w", cb => sub {
11 root 1.2 ...
12     });
13 root 1.3
14     my $w = AnyEvent->timer (after => $seconds, cb => sub {
15 root 1.2 ...
16     });
17    
18 root 1.16 my $w = AnyEvent->condvar; # stores whether a condition was flagged
19 root 1.6 $w->wait; # enters "main loop" till $condvar gets ->broadcast
20 root 1.3 $w->broadcast; # wake up current and all future wait's
21    
22 root 1.14 WHY YOU SHOULD USE THIS MODULE (OR NOT)
23     Glib, POE, IO::Async, Event... CPAN offers event models by the dozen
24     nowadays. So what is different about AnyEvent?
25    
26     Executive Summary: AnyEvent is *compatible*, AnyEvent is *free of
27     policy* and AnyEvent is *small and efficient*.
28    
29     First and foremost, *AnyEvent is not an event model* itself, it only
30     interfaces to whatever event model the main program happens to use in a
31     pragmatic way. For event models and certain classes of immortals alike,
32 root 1.16 the statement "there can only be one" is a bitter reality: In general,
33     only one event loop can be active at the same time in a process.
34     AnyEvent helps hiding the differences between those event loops.
35 root 1.14
36     The goal of AnyEvent is to offer module authors the ability to do event
37     programming (waiting for I/O or timer events) without subscribing to a
38     religion, a way of living, and most importantly: without forcing your
39     module users into the same thing by forcing them to use the same event
40     model you use.
41    
42 root 1.16 For modules like POE or IO::Async (which is a total misnomer as it is
43     actually doing all I/O *synchronously*...), using them in your module is
44     like joining a cult: After you joined, you are dependent on them and you
45     cannot use anything else, as it is simply incompatible to everything
46     that isn't itself. What's worse, all the potential users of your module
47     are *also* forced to use the same event loop you use.
48    
49     AnyEvent is different: AnyEvent + POE works fine. AnyEvent + Glib works
50     fine. AnyEvent + Tk works fine etc. etc. but none of these work together
51     with the rest: POE + IO::Async? no go. Tk + Event? no go. Again: if your
52     module uses one of those, every user of your module has to use it, too.
53     But if your module uses AnyEvent, it works transparently with all event
54     models it supports (including stuff like POE and IO::Async, as long as
55     those use one of the supported event loops. It is trivial to add new
56     event loops to AnyEvent, too, so it is future-proof).
57 root 1.14
58 root 1.16 In addition to being free of having to use *the one and only true event
59 root 1.14 model*, AnyEvent also is free of bloat and policy: with POE or similar
60     modules, you get an enourmous amount of code and strict rules you have
61 root 1.16 to follow. AnyEvent, on the other hand, is lean and up to the point, by
62     only offering the functionality that is necessary, in as thin as a
63     wrapper as technically possible.
64 root 1.14
65     Of course, if you want lots of policy (this can arguably be somewhat
66     useful) and you want to force your users to use the one and only event
67     model, you should *not* use this module.
68    
69 root 1.2 DESCRIPTION
70     AnyEvent provides an identical interface to multiple event loops. This
71 root 1.6 allows module authors to utilise an event loop without forcing module
72 root 1.2 users to use the same event loop (as only a single event loop can
73     coexist peacefully at any one time).
74    
75 root 1.16 The interface itself is vaguely similar, but not identical to the Event
76 root 1.2 module.
77    
78 root 1.16 During the first call of any watcher-creation method, the module tries
79     to detect the currently loaded event loop by probing whether one of the
80     following modules is already loaded: Coro::EV, Coro::Event, EV, Event,
81     Glib, Tk. The first one found is used. If none are found, the module
82     tries to load these modules in the stated order. The first one that can
83     be successfully loaded will be used. If, after this, still none could be
84     found, AnyEvent will fall back to a pure-perl event loop, which is not
85     very efficient, but should work everywhere.
86 root 1.6
87     Because AnyEvent first checks for modules that are already loaded,
88 root 1.16 loading an event model explicitly before first using AnyEvent will
89 root 1.6 likely make that model the default. For example:
90    
91     use Tk;
92     use AnyEvent;
93    
94     # .. AnyEvent will likely default to Tk
95    
96 root 1.16 The *likely* means that, if any module loads another event model and
97     starts using it, all bets are off. Maybe you should tell their authors
98     to use AnyEvent so their modules work together with others seamlessly...
99    
100 root 1.6 The pure-perl implementation of AnyEvent is called
101     "AnyEvent::Impl::Perl". Like other event modules you can load it
102     explicitly.
103    
104     WATCHERS
105     AnyEvent has the central concept of a *watcher*, which is an object that
106     stores relevant data for each kind of event you are waiting for, such as
107     the callback to call, the filehandle to watch, etc.
108    
109     These watchers are normal Perl objects with normal Perl lifetime. After
110     creating a watcher it will immediately "watch" for events and invoke the
111 root 1.16 callback when the event occurs (of course, only when the event model is
112     in control).
113    
114     To disable the watcher you have to destroy it (e.g. by setting the
115     variable you store it in to "undef" or otherwise deleting all references
116     to it).
117 root 1.6
118     All watchers are created by calling a method on the "AnyEvent" class.
119    
120 root 1.16 Many watchers either are used with "recursion" (repeating timers for
121     example), or need to refer to their watcher object in other ways.
122    
123     An any way to achieve that is this pattern:
124    
125     my $w; $w = AnyEvent->type (arg => value ..., cb => sub {
126     # you can use $w here, for example to undef it
127     undef $w;
128     });
129    
130     Note that "my $w; $w =" combination. This is necessary because in Perl,
131     my variables are only visible after the statement in which they are
132     declared.
133    
134 root 1.6 IO WATCHERS
135 root 1.16 You can create an I/O watcher by calling the "AnyEvent->io" method with
136     the following mandatory key-value pairs as arguments:
137 root 1.6
138 root 1.16 "fh" the Perl *file handle* (*not* file descriptor) to watch for events.
139     "poll" must be a string that is either "r" or "w", which creates a
140     watcher waiting for "r"eadable or "w"ritable events, respectively. "cb"
141     is the callback to invoke each time the file handle becomes ready.
142    
143     File handles will be kept alive, so as long as the watcher exists, the
144     file handle exists, too.
145    
146     It is not allowed to close a file handle as long as any watcher is
147     active on the underlying file descriptor.
148    
149     Some event loops issue spurious readyness notifications, so you should
150     always use non-blocking calls when reading/writing from/to your file
151     handles.
152 root 1.6
153     Example:
154    
155     # wait for readability of STDIN, then read a line and disable the watcher
156     my $w; $w = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
157     chomp (my $input = <STDIN>);
158     warn "read: $input\n";
159     undef $w;
160     });
161    
162 root 1.8 TIME WATCHERS
163     You can create a time watcher by calling the "AnyEvent->timer" method
164 root 1.6 with the following mandatory arguments:
165    
166 root 1.16 "after" specifies after how many seconds (fractional values are
167     supported) should the timer activate. "cb" the callback to invoke in
168     that case.
169 root 1.6
170     The timer callback will be invoked at most once: if you want a repeating
171     timer you have to create a new watcher (this is a limitation by both Tk
172     and Glib).
173    
174     Example:
175    
176     # fire an event after 7.7 seconds
177     my $w = AnyEvent->timer (after => 7.7, cb => sub {
178     warn "timeout\n";
179     });
180    
181     # to cancel the timer:
182 root 1.13 undef $w;
183 root 1.6
184 root 1.16 Example 2:
185    
186     # fire an event after 0.5 seconds, then roughly every second
187     my $w;
188    
189     my $cb = sub {
190     # cancel the old timer while creating a new one
191     $w = AnyEvent->timer (after => 1, cb => $cb);
192     };
193    
194     # start the "loop" by creating the first watcher
195     $w = AnyEvent->timer (after => 0.5, cb => $cb);
196    
197     TIMING ISSUES
198     There are two ways to handle timers: based on real time (relative, "fire
199     in 10 seconds") and based on wallclock time (absolute, "fire at 12
200     o'clock").
201    
202     While most event loops expect timers to specified in a relative way,
203     they use absolute time internally. This makes a difference when your
204     clock "jumps", for example, when ntp decides to set your clock backwards
205     from the wrong 2014-01-01 to 2008-01-01, a watcher that you created to
206     fire "after" a second might actually take six years to finally fire.
207    
208     AnyEvent cannot compensate for this. The only event loop that is
209     conscious about these issues is EV, which offers both relative
210     (ev_timer) and absolute (ev_periodic) timers.
211    
212     AnyEvent always prefers relative timers, if available, matching the
213     AnyEvent API.
214    
215     SIGNAL WATCHERS
216     You can watch for signals using a signal watcher, "signal" is the signal
217     *name* without any "SIG" prefix, "cb" is the Perl callback to be invoked
218     whenever a signal occurs.
219    
220     Multiple signals occurances can be clumped together into one callback
221     invocation, and callback invocation will be synchronous. synchronous
222     means that it might take a while until the signal gets handled by the
223     process, but it is guarenteed not to interrupt any other callbacks.
224    
225     The main advantage of using these watchers is that you can share a
226     signal between multiple watchers.
227    
228     This watcher might use %SIG, so programs overwriting those signals
229     directly will likely not work correctly.
230    
231     Example: exit on SIGINT
232    
233     my $w = AnyEvent->signal (signal => "INT", cb => sub { exit 1 });
234    
235     CHILD PROCESS WATCHERS
236     You can also watch on a child process exit and catch its exit status.
237    
238     The child process is specified by the "pid" argument (if set to 0, it
239     watches for any child process exit). The watcher will trigger as often
240     as status change for the child are received. This works by installing a
241     signal handler for "SIGCHLD". The callback will be called with the pid
242     and exit status (as returned by waitpid).
243    
244     Example: wait for pid 1333
245    
246     my $w = AnyEvent->child (
247     pid => 1333,
248     cb => sub {
249     my ($pid, $status) = @_;
250     warn "pid $pid exited with status $status";
251     },
252     );
253    
254     CONDITION VARIABLES
255     Condition variables can be created by calling the "AnyEvent->condvar"
256 root 1.6 method without any arguments.
257    
258 root 1.16 A condition variable waits for a condition - precisely that the
259 root 1.6 "->broadcast" method has been called.
260    
261 root 1.16 They are very useful to signal that a condition has been fulfilled, for
262     example, if you write a module that does asynchronous http requests,
263     then a condition variable would be the ideal candidate to signal the
264     availability of results.
265    
266     You can also use condition variables to block your main program until an
267     event occurs - for example, you could "->wait" in your main program
268     until the user clicks the Quit button in your app, which would
269     "->broadcast" the "quit" event.
270    
271     Note that condition variables recurse into the event loop - if you have
272     two pirces of code that call "->wait" in a round-robbin fashion, you
273     lose. Therefore, condition variables are good to export to your caller,
274     but you should avoid making a blocking wait yourself, at least in
275     callbacks, as this asks for trouble.
276 root 1.14
277 root 1.16 This object has two methods:
278 root 1.6
279     $cv->wait
280     Wait (blocking if necessary) until the "->broadcast" method has been
281     called on c<$cv>, while servicing other watchers normally.
282    
283     You can only wait once on a condition - additional calls will return
284     immediately.
285    
286 root 1.15 Not all event models support a blocking wait - some die in that case
287 root 1.16 (programs might want to do that to stay interactive), so *if you are
288     using this from a module, never require a blocking wait*, but let
289     the caller decide whether the call will block or not (for example,
290     by coupling condition variables with some kind of request results
291     and supporting callbacks so the caller knows that getting the result
292     will not block, while still suppporting blocking waits if the caller
293     so desires).
294 root 1.15
295     Another reason *never* to "->wait" in a module is that you cannot
296     sensibly have two "->wait"'s in parallel, as that would require
297     multiple interpreters or coroutines/threads, none of which
298 root 1.16 "AnyEvent" can supply (the coroutine-aware backends
299     AnyEvent::Impl::CoroEV and AnyEvent::Impl::CoroEvent explicitly
300     support concurrent "->wait"'s from different coroutines, however).
301 root 1.15
302 root 1.6 $cv->broadcast
303     Flag the condition as ready - a running "->wait" and all further
304 root 1.16 calls to "wait" will (eventually) return after this method has been
305     called. If nobody is waiting the broadcast will be remembered..
306 root 1.6
307 root 1.16 Example:
308 root 1.8
309 root 1.16 # wait till the result is ready
310     my $result_ready = AnyEvent->condvar;
311 root 1.8
312 root 1.16 # do something such as adding a timer
313     # or socket watcher the calls $result_ready->broadcast
314     # when the "result" is ready.
315     # in this case, we simply use a timer:
316     my $w = AnyEvent->timer (
317     after => 1,
318     cb => sub { $result_ready->broadcast },
319     );
320    
321     # this "blocks" (while handling events) till the watcher
322     # calls broadcast
323     $result_ready->wait;
324 root 1.8
325 root 1.16 GLOBAL VARIABLES AND FUNCTIONS
326 root 1.7 $AnyEvent::MODEL
327     Contains "undef" until the first watcher is being created. Then it
328     contains the event model that is being used, which is the name of
329     the Perl class implementing the model. This class is usually one of
330     the "AnyEvent::Impl:xxx" modules, but can be any other class in the
331     case AnyEvent has been extended at runtime (e.g. in *rxvt-unicode*).
332    
333     The known classes so far are:
334    
335 root 1.12 AnyEvent::Impl::CoroEV based on Coro::EV, best choice.
336 root 1.15 AnyEvent::Impl::CoroEvent based on Coro::Event, second best choice.
337 root 1.12 AnyEvent::Impl::EV based on EV (an interface to libev, also best choice).
338 root 1.11 AnyEvent::Impl::Event based on Event, also second best choice :)
339 root 1.15 AnyEvent::Impl::Glib based on Glib, third-best choice.
340 root 1.7 AnyEvent::Impl::Tk based on Tk, very bad choice.
341 root 1.15 AnyEvent::Impl::Perl pure-perl implementation, inefficient but portable.
342 root 1.7
343 root 1.8 AnyEvent::detect
344     Returns $AnyEvent::MODEL, forcing autodetection of the event model
345     if necessary. You should only call this function right before you
346 root 1.16 would have created an AnyEvent watcher anyway, that is, as late as
347     possible at runtime.
348 root 1.8
349 root 1.6 WHAT TO DO IN A MODULE
350     As a module author, you should "use AnyEvent" and call AnyEvent methods
351     freely, but you should not load a specific event module or rely on it.
352    
353 root 1.16 Be careful when you create watchers in the module body - AnyEvent will
354 root 1.6 decide which event module to use as soon as the first method is called,
355     so by calling AnyEvent in your module body you force the user of your
356     module to load the event module first.
357    
358 root 1.16 Never call "->wait" on a condition variable unless you *know* that the
359     "->broadcast" method has been called on it already. This is because it
360     will stall the whole program, and the whole point of using events is to
361     stay interactive.
362    
363     It is fine, however, to call "->wait" when the user of your module
364     requests it (i.e. if you create a http request object ad have a method
365     called "results" that returns the results, it should call "->wait"
366     freely, as the user of your module knows what she is doing. always).
367    
368 root 1.6 WHAT TO DO IN THE MAIN PROGRAM
369     There will always be a single main program - the only place that should
370     dictate which event model to use.
371    
372     If it doesn't care, it can just "use AnyEvent" and use it itself, or not
373 root 1.16 do anything special (it does not need to be event-based) and let
374     AnyEvent decide which implementation to chose if some module relies on
375     it.
376    
377     If the main program relies on a specific event model. For example, in
378     Gtk2 programs you have to rely on the Glib module. You should load the
379     event module before loading AnyEvent or any module that uses it:
380     generally speaking, you should load it as early as possible. The reason
381     is that modules might create watchers when they are loaded, and AnyEvent
382     will decide on the event model to use as soon as it creates watchers,
383     and it might chose the wrong one unless you load the correct one
384     yourself.
385 root 1.6
386     You can chose to use a rather inefficient pure-perl implementation by
387 root 1.16 loading the "AnyEvent::Impl::Perl" module, which gives you similar
388     behaviour everywhere, but letting AnyEvent chose is generally better.
389 root 1.2
390 root 1.5 SUPPLYING YOUR OWN EVENT MODEL INTERFACE
391 root 1.16 This is an advanced topic that you do not normally need to use AnyEvent
392     in a module. This section is only of use to event loop authors who want
393     to provide AnyEvent compatibility.
394    
395 root 1.5 If you need to support another event library which isn't directly
396     supported by AnyEvent, you can supply your own interface to it by
397 root 1.6 pushing, before the first watcher gets created, the package name of the
398 root 1.5 event module and the package name of the interface to use onto
399     @AnyEvent::REGISTRY. You can do that before and even without loading
400 root 1.16 AnyEvent, so it is reasonably cheap.
401 root 1.5
402     Example:
403    
404     push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::];
405    
406 root 1.6 This tells AnyEvent to (literally) use the "urxvt::anyevent::"
407 root 1.16 package/class when it finds the "urxvt" package/module is already
408     loaded.
409    
410     When AnyEvent is loaded and asked to find a suitable event model, it
411     will first check for the presence of urxvt by trying to "use" the
412     "urxvt::anyevent" module.
413    
414     The class should provide implementations for all watcher types. See
415     AnyEvent::Impl::EV (source code), AnyEvent::Impl::Glib (Source code) and
416     so on for actual examples. Use "perldoc -m AnyEvent::Impl::Glib" to see
417     the sources.
418    
419     If you don't provide "signal" and "child" watchers than AnyEvent will
420     provide suitable (hopefully) replacements.
421    
422     The above example isn't fictitious, the *rxvt-unicode* (a.k.a. urxvt)
423     terminal emulator uses the above line as-is. An interface isn't included
424     in AnyEvent because it doesn't make sense outside the embedded
425     interpreter inside *rxvt-unicode*, and it is updated and maintained as
426     part of the *rxvt-unicode* distribution.
427 root 1.5
428 root 1.6 *rxvt-unicode* also cheats a bit by not providing blocking access to
429     condition variables: code blocking while waiting for a condition will
430     "die". This still works with most modules/usages, and blocking calls
431 root 1.16 must not be done in an interactive application, so it makes sense.
432 root 1.6
433 root 1.4 ENVIRONMENT VARIABLES
434     The following environment variables are used by this module:
435    
436 root 1.16 "PERL_ANYEVENT_VERBOSE" when set to 2 or higher, cause AnyEvent to
437     report to STDERR which event model it chooses.
438 root 1.4
439 root 1.16 EXAMPLE PROGRAM
440     The following program uses an IO watcher to read data from STDIN, a
441     timer to display a message once per second, and a condition variable to
442     quit the program when the user enters quit:
443 root 1.2
444     use AnyEvent;
445    
446     my $cv = AnyEvent->condvar;
447    
448 root 1.16 my $io_watcher = AnyEvent->io (
449     fh => \*STDIN,
450     poll => 'r',
451     cb => sub {
452     warn "io event <$_[0]>\n"; # will always output <r>
453     chomp (my $input = <STDIN>); # read a line
454     warn "read: $input\n"; # output what has been read
455     $cv->broadcast if $input =~ /^q/i; # quit program if /^q/i
456     },
457     );
458 root 1.2
459     my $time_watcher; # can only be used once
460    
461     sub new_timer {
462     $timer = AnyEvent->timer (after => 1, cb => sub {
463     warn "timeout\n"; # print 'timeout' about every second
464     &new_timer; # and restart the time
465     });
466     }
467    
468     new_timer; # create first timer
469    
470     $cv->wait; # wait until user enters /^q/i
471    
472 root 1.3 REAL-WORLD EXAMPLE
473     Consider the Net::FCP module. It features (among others) the following
474     API calls, which are to freenet what HTTP GET requests are to http:
475    
476     my $data = $fcp->client_get ($url); # blocks
477    
478     my $transaction = $fcp->txn_client_get ($url); # does not block
479     $transaction->cb ( sub { ... } ); # set optional result callback
480     my $data = $transaction->result; # possibly blocks
481    
482     The "client_get" method works like "LWP::Simple::get": it requests the
483     given URL and waits till the data has arrived. It is defined to be:
484    
485     sub client_get { $_[0]->txn_client_get ($_[1])->result }
486    
487     And in fact is automatically generated. This is the blocking API of
488     Net::FCP, and it works as simple as in any other, similar, module.
489    
490     More complicated is "txn_client_get": It only creates a transaction
491     (completion, result, ...) object and initiates the transaction.
492    
493     my $txn = bless { }, Net::FCP::Txn::;
494    
495     It also creates a condition variable that is used to signal the
496     completion of the request:
497    
498     $txn->{finished} = AnyAvent->condvar;
499    
500     It then creates a socket in non-blocking mode.
501    
502     socket $txn->{fh}, ...;
503     fcntl $txn->{fh}, F_SETFL, O_NONBLOCK;
504     connect $txn->{fh}, ...
505     and !$!{EWOULDBLOCK}
506     and !$!{EINPROGRESS}
507     and Carp::croak "unable to connect: $!\n";
508    
509 root 1.4 Then it creates a write-watcher which gets called whenever an error
510 root 1.3 occurs or the connection succeeds:
511    
512     $txn->{w} = AnyEvent->io (fh => $txn->{fh}, poll => 'w', cb => sub { $txn->fh_ready_w });
513    
514     And returns this transaction object. The "fh_ready_w" callback gets
515     called as soon as the event loop detects that the socket is ready for
516     writing.
517    
518     The "fh_ready_w" method makes the socket blocking again, writes the
519     request data and replaces the watcher by a read watcher (waiting for
520     reply data). The actual code is more complicated, but that doesn't
521     matter for this example:
522    
523     fcntl $txn->{fh}, F_SETFL, 0;
524     syswrite $txn->{fh}, $txn->{request}
525     or die "connection or write error";
526     $txn->{w} = AnyEvent->io (fh => $txn->{fh}, poll => 'r', cb => sub { $txn->fh_ready_r });
527    
528     Again, "fh_ready_r" waits till all data has arrived, and then stores the
529     result and signals any possible waiters that the request ahs finished:
530    
531     sysread $txn->{fh}, $txn->{buf}, length $txn->{$buf};
532    
533     if (end-of-file or data complete) {
534     $txn->{result} = $txn->{buf};
535     $txn->{finished}->broadcast;
536 root 1.4 $txb->{cb}->($txn) of $txn->{cb}; # also call callback
537 root 1.3 }
538    
539     The "result" method, finally, just waits for the finished signal (if the
540     request was already finished, it doesn't wait, of course, and returns
541     the data:
542    
543     $txn->{finished}->wait;
544 root 1.4 return $txn->{result};
545 root 1.3
546     The actual code goes further and collects all errors ("die"s,
547     exceptions) that occured during request processing. The "result" method
548 root 1.16 detects whether an exception as thrown (it is stored inside the $txn
549 root 1.3 object) and just throws the exception, which means connection errors and
550     other problems get reported tot he code that tries to use the result,
551     not in a random callback.
552    
553     All of this enables the following usage styles:
554    
555     1. Blocking:
556    
557     my $data = $fcp->client_get ($url);
558    
559 root 1.15 2. Blocking, but running in parallel:
560 root 1.3
561     my @datas = map $_->result,
562     map $fcp->txn_client_get ($_),
563     @urls;
564    
565     Both blocking examples work without the module user having to know
566     anything about events.
567    
568 root 1.15 3a. Event-based in a main program, using any supported event module:
569 root 1.3
570 root 1.15 use EV;
571 root 1.3
572     $fcp->txn_client_get ($url)->cb (sub {
573     my $txn = shift;
574     my $data = $txn->result;
575     ...
576     });
577    
578 root 1.15 EV::loop;
579 root 1.3
580     3b. The module user could use AnyEvent, too:
581    
582     use AnyEvent;
583    
584     my $quit = AnyEvent->condvar;
585    
586     $fcp->txn_client_get ($url)->cb (sub {
587     ...
588     $quit->broadcast;
589     });
590    
591     $quit->wait;
592    
593 root 1.2 SEE ALSO
594 root 1.15 Event modules: Coro::EV, EV, EV::Glib, Glib::EV, Coro::Event, Event,
595     Glib::Event, Glib, Coro, Tk.
596 root 1.3
597 root 1.15 Implementations: AnyEvent::Impl::CoroEV, AnyEvent::Impl::EV,
598     AnyEvent::Impl::CoroEvent, AnyEvent::Impl::Event, AnyEvent::Impl::Glib,
599     AnyEvent::Impl::Tk, AnyEvent::Impl::Perl.
600 root 1.3
601 root 1.15 Nontrivial usage examples: Net::FCP, Net::XMPP2.
602 root 1.2
603 root 1.17 AUTHOR
604     Marc Lehmann <schmorp@schmorp.de>
605     http://home.schmorp.de/
606 root 1.2