ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/README
Revision: 1.5
Committed: Sun Jan 8 04:41:08 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
CVS Tags: rel-1_0, rel-1_02, rel-1_01
Changes since 1.4: +23 -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     Event, Coro, Glib, Tk - various supported event loops
5    
6     SYNOPSIS
7 root 1.4 use AnyEvent;
8 root 1.2
9 root 1.3 my $w = AnyEvent->io (fh => ..., poll => "[rw]+", cb => sub {
10 root 1.2 my ($poll_got) = @_;
11     ...
12     });
13 root 1.3
14 root 1.4 * only one io watcher per $fh and $poll type is allowed (i.e. on a
15     socket you can have one r + one w or one rw watcher, not any more
16     (limitation by Tk).
17    
18     * the $poll_got passed to the handler needs to be checked by looking for
19     single characters (e.g. with a regex), as it can contain more event
20     types than were requested (e.g. a 'w' watcher might generate 'rw'
21     events, limitation by Glib).
22 root 1.3
23 root 1.4 * AnyEvent will keep filehandles alive, so as long as the watcher
24 root 1.3 exists, the filehandle exists.
25    
26     my $w = AnyEvent->timer (after => $seconds, cb => sub {
27 root 1.2 ...
28     });
29    
30 root 1.4 * io and time watchers get canceled whenever $w is destroyed, so keep a
31 root 1.3 copy
32    
33 root 1.4 * timers can only be used once and must be recreated for repeated
34     operation (limitation by Glib and Tk).
35 root 1.2
36     my $w = AnyEvent->condvar; # kind of main loop replacement
37 root 1.3 $w->wait; # enters main loop till $condvar gets ->broadcast
38     $w->broadcast; # wake up current and all future wait's
39    
40 root 1.4 * condvars are used to give blocking behaviour when neccessary. Create a
41 root 1.3 condvar for any "request" or "event" your module might create,
42     "->broadcast" it when the event happens and provide a function that
43     calls "->wait" for it. See the examples below.
44 root 1.2
45     DESCRIPTION
46     AnyEvent provides an identical interface to multiple event loops. This
47     allows module authors to utilizy an event loop without forcing module
48     users to use the same event loop (as only a single event loop can
49     coexist peacefully at any one time).
50    
51     The interface itself is vaguely similar but not identical to the Event
52     module.
53    
54     On the first call of any method, the module tries to detect the
55     currently loaded event loop by probing wether any of the following
56     modules is loaded: Coro::Event, Event, Glib, Tk. The first one found is
57     used. If none is found, the module tries to load these modules in the
58     order given. The first one that could be successfully loaded will be
59     used. If still none could be found, it will issue an error.
60    
61 root 1.5 SUPPLYING YOUR OWN EVENT MODEL INTERFACE
62     If you need to support another event library which isn't directly
63     supported by AnyEvent, you can supply your own interface to it by
64     pushing, before the first watch gets created, the package name of the
65     event module and the package name of the interface to use onto
66     @AnyEvent::REGISTRY. You can do that before and even without loading
67     AnyEvent.
68    
69     Example:
70    
71     push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::];
72    
73     This tells AnyEvent to (literally) use the "urxvt::anyevent::" module
74     when it finds the "urxvt" module is loaded. When AnyEvent is loaded and
75     requested to find a suitable event model, it will first check for the
76     urxvt module.
77    
78     The above isn't fictitious, the *rxvt-unicode* (a.k.a. urxvt) uses the
79     above line exactly. An interface isn't included in AnyEvent because it
80     doesn't make sense outside the embedded interpreter inside
81     *rxvt-unicode*, and it is updated and maintained as part of the
82     *rxvt-unicode* distribution.
83    
84 root 1.4 ENVIRONMENT VARIABLES
85     The following environment variables are used by this module:
86    
87     "PERL_ANYEVENT_VERBOSE" when set to 2 or higher, reports which event
88     model gets used.
89    
90 root 1.2 EXAMPLE
91     The following program uses an io watcher to read data from stdin, a
92     timer to display a message once per second, and a condvar to exit the
93     program when the user enters quit:
94    
95     use AnyEvent;
96    
97     my $cv = AnyEvent->condvar;
98    
99     my $io_watcher = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
100     warn "io event <$_[0]>\n"; # will always output <r>
101     chomp (my $input = <STDIN>); # read a line
102     warn "read: $input\n"; # output what has been read
103     $cv->broadcast if $input =~ /^q/i; # quit program if /^q/i
104     });
105    
106     my $time_watcher; # can only be used once
107    
108     sub new_timer {
109     $timer = AnyEvent->timer (after => 1, cb => sub {
110     warn "timeout\n"; # print 'timeout' about every second
111     &new_timer; # and restart the time
112     });
113     }
114    
115     new_timer; # create first timer
116    
117     $cv->wait; # wait until user enters /^q/i
118    
119 root 1.3 REAL-WORLD EXAMPLE
120     Consider the Net::FCP module. It features (among others) the following
121     API calls, which are to freenet what HTTP GET requests are to http:
122    
123     my $data = $fcp->client_get ($url); # blocks
124    
125     my $transaction = $fcp->txn_client_get ($url); # does not block
126     $transaction->cb ( sub { ... } ); # set optional result callback
127     my $data = $transaction->result; # possibly blocks
128    
129     The "client_get" method works like "LWP::Simple::get": it requests the
130     given URL and waits till the data has arrived. It is defined to be:
131    
132     sub client_get { $_[0]->txn_client_get ($_[1])->result }
133    
134     And in fact is automatically generated. This is the blocking API of
135     Net::FCP, and it works as simple as in any other, similar, module.
136    
137     More complicated is "txn_client_get": It only creates a transaction
138     (completion, result, ...) object and initiates the transaction.
139    
140     my $txn = bless { }, Net::FCP::Txn::;
141    
142     It also creates a condition variable that is used to signal the
143     completion of the request:
144    
145     $txn->{finished} = AnyAvent->condvar;
146    
147     It then creates a socket in non-blocking mode.
148    
149     socket $txn->{fh}, ...;
150     fcntl $txn->{fh}, F_SETFL, O_NONBLOCK;
151     connect $txn->{fh}, ...
152     and !$!{EWOULDBLOCK}
153     and !$!{EINPROGRESS}
154     and Carp::croak "unable to connect: $!\n";
155    
156 root 1.4 Then it creates a write-watcher which gets called whenever an error
157 root 1.3 occurs or the connection succeeds:
158    
159     $txn->{w} = AnyEvent->io (fh => $txn->{fh}, poll => 'w', cb => sub { $txn->fh_ready_w });
160    
161     And returns this transaction object. The "fh_ready_w" callback gets
162     called as soon as the event loop detects that the socket is ready for
163     writing.
164    
165     The "fh_ready_w" method makes the socket blocking again, writes the
166     request data and replaces the watcher by a read watcher (waiting for
167     reply data). The actual code is more complicated, but that doesn't
168     matter for this example:
169    
170     fcntl $txn->{fh}, F_SETFL, 0;
171     syswrite $txn->{fh}, $txn->{request}
172     or die "connection or write error";
173     $txn->{w} = AnyEvent->io (fh => $txn->{fh}, poll => 'r', cb => sub { $txn->fh_ready_r });
174    
175     Again, "fh_ready_r" waits till all data has arrived, and then stores the
176     result and signals any possible waiters that the request ahs finished:
177    
178     sysread $txn->{fh}, $txn->{buf}, length $txn->{$buf};
179    
180     if (end-of-file or data complete) {
181     $txn->{result} = $txn->{buf};
182     $txn->{finished}->broadcast;
183 root 1.4 $txb->{cb}->($txn) of $txn->{cb}; # also call callback
184 root 1.3 }
185    
186     The "result" method, finally, just waits for the finished signal (if the
187     request was already finished, it doesn't wait, of course, and returns
188     the data:
189    
190     $txn->{finished}->wait;
191 root 1.4 return $txn->{result};
192 root 1.3
193     The actual code goes further and collects all errors ("die"s,
194     exceptions) that occured during request processing. The "result" method
195     detects wether an exception as thrown (it is stored inside the $txn
196     object) and just throws the exception, which means connection errors and
197     other problems get reported tot he code that tries to use the result,
198     not in a random callback.
199    
200     All of this enables the following usage styles:
201    
202     1. Blocking:
203    
204     my $data = $fcp->client_get ($url);
205    
206     2. Blocking, but parallelizing:
207    
208     my @datas = map $_->result,
209     map $fcp->txn_client_get ($_),
210     @urls;
211    
212     Both blocking examples work without the module user having to know
213     anything about events.
214    
215     3a. Event-based in a main program, using any support Event module:
216    
217     use Event;
218    
219     $fcp->txn_client_get ($url)->cb (sub {
220     my $txn = shift;
221     my $data = $txn->result;
222     ...
223     });
224    
225     Event::loop;
226    
227     3b. The module user could use AnyEvent, too:
228    
229     use AnyEvent;
230    
231     my $quit = AnyEvent->condvar;
232    
233     $fcp->txn_client_get ($url)->cb (sub {
234     ...
235     $quit->broadcast;
236     });
237    
238     $quit->wait;
239    
240 root 1.2 SEE ALSO
241 root 1.3 Event modules: Coro::Event, Coro, Event, Glib::Event, Glib.
242    
243     Implementations: AnyEvent::Impl::Coro, AnyEvent::Impl::Event,
244     AnyEvent::Impl::Glib, AnyEvent::Impl::Tk.
245    
246     Nontrivial usage example: Net::FCP.
247 root 1.2
248