ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-Fork-RPC/RPC.pm
Revision: 1.15
Committed: Thu Apr 18 13:15:23 2013 UTC (11 years, 1 month ago) by root
Branch: MAIN
Changes since 1.14: +5 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     AnyEvent::Fork::RPC - simple RPC extension for AnyEvent::Fork
4    
5     =head1 SYNOPSIS
6    
7     use AnyEvent::Fork::RPC;
8 root 1.7 # use AnyEvent::Fork is not needed
9 root 1.1
10     my $rpc = AnyEvent::Fork
11     ->new
12     ->require ("MyModule")
13     ->AnyEvent::Fork::RPC::run (
14     "MyModule::server",
15     );
16    
17     my $cv = AE::cv;
18    
19     $rpc->(1, 2, 3, sub {
20     print "MyModule::server returned @_\n";
21     $cv->send;
22     });
23    
24     $cv->recv;
25    
26     =head1 DESCRIPTION
27    
28     This module implements a simple RPC protocol and backend for processes
29     created via L<AnyEvent::Fork>, allowing you to call a function in the
30     child process and receive its return values (up to 4GB serialised).
31    
32     It implements two different backends: a synchronous one that works like a
33     normal function call, and an asynchronous one that can run multiple jobs
34     concurrently in the child, using AnyEvent.
35    
36     It also implements an asynchronous event mechanism from the child to the
37     parent, that could be used for progress indications or other information.
38    
39 root 1.7 Loading this module also always loads L<AnyEvent::Fork>, so you can make a
40     separate C<use AnyEvent::Fork> if you wish, but you don't have to.
41    
42 root 1.4 =head1 EXAMPLES
43    
44 root 1.10 =head2 Example 1: Synchronous Backend
45 root 1.4
46     Here is a simple example that implements a backend that executes C<unlink>
47     and C<rmdir> calls, and reports their status back. It also reports the
48     number of requests it has processed every three requests, which is clearly
49     silly, but illustrates the use of events.
50    
51     First the parent process:
52    
53     use AnyEvent;
54     use AnyEvent::Fork::RPC;
55    
56     my $done = AE::cv;
57    
58     my $rpc = AnyEvent::Fork
59     ->new
60     ->require ("MyWorker")
61     ->AnyEvent::Fork::RPC::run ("MyWorker::run",
62 root 1.5 on_error => sub { warn "FATAL: $_[0]"; exit 1 },
63 root 1.4 on_event => sub { warn "$_[0] requests handled\n" },
64     on_destroy => $done,
65     );
66    
67     for my $id (1..6) {
68     $rpc->(rmdir => "/tmp/somepath/$id", sub {
69     $_[0]
70     or warn "/tmp/somepath/$id: $_[1]\n";
71     });
72     }
73    
74     undef $rpc;
75    
76     $done->recv;
77    
78     The parent creates the process, queues a few rmdir's. It then forgets
79     about the C<$rpc> object, so that the child exits after it has handled the
80     requests, and then it waits till the requests have been handled.
81    
82     The child is implemented using a separate module, C<MyWorker>, shown here:
83    
84     package MyWorker;
85    
86     my $count;
87    
88     sub run {
89     my ($cmd, $path) = @_;
90    
91     AnyEvent::Fork::RPC::event ($count)
92     unless ++$count % 3;
93    
94     my $status = $cmd eq "rmdir" ? rmdir $path
95     : $cmd eq "unlink" ? unlink $path
96     : die "fatal error, illegal command '$cmd'";
97    
98     $status or (0, "$!")
99     }
100    
101     1
102    
103     The C<run> function first sends a "progress" event every three calls, and
104     then executes C<rmdir> or C<unlink>, depending on the first parameter (or
105     dies with a fatal error - obviously, you must never let this happen :).
106    
107     Eventually it returns the status value true if the command was successful,
108     or the status value 0 and the stringified error message.
109    
110 root 1.6 On my system, running the first code fragment with the given
111 root 1.4 F<MyWorker.pm> in the current directory yields:
112    
113     /tmp/somepath/1: No such file or directory
114     /tmp/somepath/2: No such file or directory
115     3 requests handled
116     /tmp/somepath/3: No such file or directory
117     /tmp/somepath/4: No such file or directory
118     /tmp/somepath/5: No such file or directory
119     6 requests handled
120     /tmp/somepath/6: No such file or directory
121    
122     Obviously, none of the directories I am trying to delete even exist. Also,
123     the events and responses are processed in exactly the same order as
124     they were created in the child, which is true for both synchronous and
125     asynchronous backends.
126    
127     Note that the parentheses in the call to C<AnyEvent::Fork::RPC::event> are
128     not optional. That is because the function isn't defined when the code is
129     compiled. You can make sure it is visible by pre-loading the correct
130     backend module in the call to C<require>:
131    
132     ->require ("AnyEvent::Fork::RPC::Sync", "MyWorker")
133    
134     Since the backend module declares the C<event> function, loading it first
135     ensures that perl will correctly interpret calls to it.
136    
137     And as a final remark, there is a fine module on CPAN that can
138     asynchronously C<rmdir> and C<unlink> and a lot more, and more efficiently
139     than this example, namely L<IO::AIO>.
140    
141 root 1.10 =head3 Example 1a: the same with the asynchronous backend
142    
143     This example only shows what needs to be changed to use the async backend
144     instead. Doing this is not very useful, the purpose of this example is
145     to show the minimum amount of change that is required to go from the
146     synchronous to the asynchronous backend.
147    
148     To use the async backend in the previous example, you need to add the
149     C<async> parameter to the C<AnyEvent::Fork::RPC::run> call:
150    
151     ->AnyEvent::Fork::RPC::run ("MyWorker::run",
152     async => 1,
153     ...
154    
155     And since the function call protocol is now changed, you need to adopt
156     C<MyWorker::run> to the async API.
157    
158     First, you need to accept the extra initial C<$done> callback:
159    
160     sub run {
161     my ($done, $cmd, $path) = @_;
162    
163     And since a response is now generated when C<$done> is called, as opposed
164     to when the function returns, we need to call the C<$done> function with
165     the status:
166    
167     $done->($status or (0, "$!"));
168    
169     A few remarks are in order. First, it's quite pointless to use the async
170     backend for this example - but it I<is> possible. Second, you can call
171     C<$done> before or after returning from the function. Third, having both
172     returned from the function and having called the C<$done> callback, the
173     child process may exit at any time, so you should call C<$done> only when
174     you really I<are> done.
175    
176     =head2 Example 2: Asynchronous Backend
177    
178 root 1.11 This example implements multiple count-downs in the child, using
179     L<AnyEvent> timers. While this is a bit silly (one could use timers in te
180     parent just as well), it illustrates the ability to use AnyEvent in the
181     child and the fact that responses can arrive in a different order then the
182     requests.
183    
184     It also shows how to embed the actual child code into a C<__DATA__>
185     section, so it doesn't need any external files at all.
186    
187     And when your parent process is often busy, and you have stricter timing
188     requirements, then running timers in a child process suddenly doesn't look
189     so silly anymore.
190    
191     Without further ado, here is the code:
192    
193     use AnyEvent;
194     use AnyEvent::Fork::RPC;
195    
196     my $done = AE::cv;
197    
198     my $rpc = AnyEvent::Fork
199     ->new
200     ->require ("AnyEvent::Fork::RPC::Async")
201     ->eval (do { local $/; <DATA> })
202     ->AnyEvent::Fork::RPC::run ("run",
203     async => 1,
204     on_error => sub { warn "FATAL: $_[0]"; exit 1 },
205     on_event => sub { print $_[0] },
206     on_destroy => $done,
207     );
208    
209     for my $count (3, 2, 1) {
210     $rpc->($count, sub {
211     warn "job $count finished\n";
212     });
213     }
214    
215     undef $rpc;
216    
217     $done->recv;
218    
219     __DATA__
220    
221     # this ends up in main, as we don't use a package declaration
222    
223     use AnyEvent;
224    
225     sub run {
226     my ($done, $count) = @_;
227    
228     my $n;
229    
230     AnyEvent::Fork::RPC::event "starting to count up to $count\n";
231    
232     my $w; $w = AE::timer 1, 1, sub {
233     ++$n;
234    
235     AnyEvent::Fork::RPC::event "count $n of $count\n";
236    
237     if ($n == $count) {
238     undef $w;
239     $done->();
240     }
241     };
242     }
243    
244     The parent part (the one before the C<__DATA__> section) isn't very
245     different from the earlier examples. It sets async mode, preloads
246     the backend module (so the C<AnyEvent::Fork::RPC::event> function is
247     declared), uses a slightly different C<on_event> handler (which we use
248     simply for logging purposes) and then, instead of loading a module with
249     the actual worker code, it C<eval>'s the code from the data section in the
250     child process.
251    
252     It then starts three countdowns, from 3 to 1 seconds downwards, destroys
253     the rpc object so the example finishes eventually, and then just waits for
254     the stuff to trickle in.
255    
256     The worker code uses the event function to log some progress messages, but
257     mostly just creates a recurring one-second timer.
258    
259     The timer callback increments a counter, logs a message, and eventually,
260     when the count has been reached, calls the finish callback.
261    
262     On my system, this results in the following output. Since all timers fire
263     at roughly the same time, the actual order isn't guaranteed, but the order
264     shown is very likely what you would get, too.
265    
266     starting to count up to 3
267     starting to count up to 2
268     starting to count up to 1
269     count 1 of 3
270     count 1 of 2
271     count 1 of 1
272     job 1 finished
273     count 2 of 2
274     job 2 finished
275     count 2 of 3
276     count 3 of 3
277     job 3 finished
278    
279     While the overall ordering isn't guaranteed, the async backend still
280     guarantees that events and responses are delivered to the parent process
281     in the exact same ordering as they were generated in the child process.
282    
283     And unless your system is I<very> busy, it should clearly show that the
284     job started last will finish first, as it has the lowest count.
285    
286     This concludes the async example. Since L<AnyEvent::Fork> does not
287     actually fork, you are free to use about any module in the child, not just
288     L<AnyEvent>, but also L<IO::AIO>, or L<Tk> for example.
289 root 1.10
290 root 1.1 =head1 PARENT PROCESS USAGE
291    
292     This module exports nothing, and only implements a single function:
293    
294     =over 4
295    
296     =cut
297    
298     package AnyEvent::Fork::RPC;
299    
300     use common::sense;
301    
302     use Errno ();
303     use Guard ();
304    
305     use AnyEvent;
306 root 1.7 use AnyEvent::Fork; # we don't actually depend on it, this is for convenience
307 root 1.1
308     our $VERSION = 0.1;
309    
310     =item my $rpc = AnyEvent::Fork::RPC::run $fork, $function, [key => value...]
311    
312     The traditional way to call it. But it is way cooler to call it in the
313     following way:
314    
315     =item my $rpc = $fork->AnyEvent::Fork::RPC::run ($function, [key => value...])
316    
317     This C<run> function/method can be used in place of the
318     L<AnyEvent::Fork::run> method. Just like that method, it takes over
319     the L<AnyEvent::Fork> process, but instead of calling the specified
320     C<$function> directly, it runs a server that accepts RPC calls and handles
321     responses.
322    
323     It returns a function reference that can be used to call the function in
324     the child process, handling serialisation and data transfers.
325    
326     The following key/value pairs are allowed. It is recommended to have at
327     least an C<on_error> or C<on_event> handler set.
328    
329     =over 4
330    
331     =item on_error => $cb->($msg)
332    
333     Called on (fatal) errors, with a descriptive (hopefully) message. If
334     this callback is not provided, but C<on_event> is, then the C<on_event>
335     callback is called with the first argument being the string C<error>,
336     followed by the error message.
337    
338     If neither handler is provided it prints the error to STDERR and will
339     start failing badly.
340    
341     =item on_event => $cb->(...)
342    
343     Called for every call to the C<AnyEvent::Fork::RPC::event> function in the
344     child, with the arguments of that function passed to the callback.
345    
346     Also called on errors when no C<on_error> handler is provided.
347    
348 root 1.4 =item on_destroy => $cb->()
349    
350     Called when the C<$rpc> object has been destroyed and all requests have
351     been successfully handled. This is useful when you queue some requests and
352     want the child to go away after it has handled them. The problem is that
353     the parent must not exit either until all requests have been handled, and
354 root 1.6 this can be accomplished by waiting for this callback.
355 root 1.4
356 root 1.1 =item init => $function (default none)
357    
358     When specified (by name), this function is called in the child as the very
359     first thing when taking over the process, with all the arguments normally
360     passed to the C<AnyEvent::Fork::run> function, except the communications
361     socket.
362    
363     It can be used to do one-time things in the child such as storing passed
364     parameters or opening database connections.
365    
366 root 1.4 It is called very early - before the serialisers are created or the
367     C<$function> name is resolved into a function reference, so it could be
368     used to load any modules that provide the serialiser or function. It can
369     not, however, create events.
370    
371 root 1.1 =item async => $boolean (default: 0)
372    
373     The default server used in the child does all I/O blockingly, and only
374     allows a single RPC call to execute concurrently.
375    
376     Setting C<async> to a true value switches to another implementation that
377 root 1.15 uses L<AnyEvent> in the child and allows multiple concurrent RPC calls (it
378     does not support recursion in the event loop however, blocking condvar
379     calls will fail).
380 root 1.1
381     The actual API in the child is documented in the section that describes
382     the calling semantics of the returned C<$rpc> function.
383    
384 root 1.2 If you want to pre-load the actual back-end modules to enable memory
385     sharing, then you should load C<AnyEvent::Fork::RPC::Sync> for
386     synchronous, and C<AnyEvent::Fork::RPC::Async> for asynchronous mode.
387    
388 root 1.4 If you use a template process and want to fork both sync and async
389 root 1.6 children, then it is permissible to load both modules.
390 root 1.4
391 root 1.14 =item serialiser => $string (default: $AnyEvent::Fork::RPC::STRING_SERIALISER)
392 root 1.1
393     All arguments, result data and event data have to be serialised to be
394     transferred between the processes. For this, they have to be frozen and
395     thawed in both parent and child processes.
396    
397     By default, only octet strings can be passed between the processes, which
398 root 1.14 is reasonably fast and efficient and requires no extra modules.
399 root 1.1
400     For more complicated use cases, you can provide your own freeze and thaw
401     functions, by specifying a string with perl source code. It's supposed to
402     return two code references when evaluated: the first receives a list of
403     perl values and must return an octet string. The second receives the octet
404     string and must return the original list of values.
405    
406 root 1.2 If you need an external module for serialisation, then you can either
407     pre-load it into your L<AnyEvent::Fork> process, or you can add a C<use>
408     or C<require> statement into the serialiser string. Or both.
409    
410 root 1.14 Here are some examples - some of them are also available as global
411     variables that make them easier to use.
412    
413     =over 4
414    
415     =item octet strings - C<$AnyEvent::Fork::RPC::STRING_SERIALISER>
416    
417     This serialiser concatenates length-prefixes octet strings, and is the
418     default.
419    
420     Implementation:
421    
422     (
423     sub { pack "(w/a*)*", @_ },
424     sub { unpack "(w/a*)*", shift }
425     )
426    
427     =item json - C<$AnyEvent::Fork::RPC::JSON_SERIALISER>
428    
429     This serialiser creates JSON arrays - you have to make sure the L<JSON>
430     module is installed for this serialiser to work. It can be beneficial for
431     sharing when you preload the L<JSON> module in a template process.
432    
433     L<JSON> (with L<JSON::XS> installed) is slower than the octet string
434     serialiser, but usually much faster than L<Storable>, unless big chunks of
435     binary data need to be transferred.
436    
437     Implementation:
438    
439     use JSON ();
440     (
441     sub { JSON::encode_json \@_ },
442     sub { @{ JSON::decode_json shift } }
443     )
444    
445     =item storable - C<$AnyEvent::Fork::RPC::STORABLE_SERIALISER>
446    
447     This serialiser uses L<Storable>, which means it has high chance of
448     serialising just about anything you throw at it, at the cost of having
449     very high overhead per operation. It also comes with perl.
450    
451     Implementation:
452    
453     use Storable ();
454     (
455     sub { Storable::freeze \@_ },
456     sub { @{ Storable::thaw shift } }
457     )
458    
459     =back
460    
461 root 1.1 =back
462    
463 root 1.9 See the examples section earlier in this document for some actual
464     examples.
465 root 1.8
466 root 1.1 =cut
467    
468 root 1.14 our $STRING_SERIALISER = '(sub { pack "(w/a*)*", @_ }, sub { unpack "(w/a*)*", shift })';
469     our $JSON_SERIALISER = 'use JSON (); (sub { JSON::encode_json \@_ }, sub { @{ JSON::decode_json shift } })';
470     our $STORABLE_SERIALISER = 'use Storable (); (sub { Storable::freeze \@_ }, sub { @{ Storable::thaw shift } })';
471 root 1.2
472 root 1.1 sub run {
473     my ($self, $function, %arg) = @_;
474    
475 root 1.2 my $serialiser = delete $arg{serialiser} || $STRING_SERIALISER;
476 root 1.1 my $on_event = delete $arg{on_event};
477     my $on_error = delete $arg{on_error};
478 root 1.4 my $on_destroy = delete $arg{on_destroy};
479 root 1.1
480     # default for on_error is to on_event, if specified
481     $on_error ||= $on_event
482     ? sub { $on_event->(error => shift) }
483     : sub { die "AnyEvent::Fork::RPC: uncaught error: $_[0].\n" };
484    
485     # default for on_event is to raise an error
486     $on_event ||= sub { $on_error->("event received, but no on_event handler") };
487    
488     my ($f, $t) = eval $serialiser; die $@ if $@;
489    
490 root 1.9 my (@rcb, %rcb, $fh, $shutdown, $wbuf, $ww);
491     my ($rlen, $rbuf, $rw) = 512 - 16;
492 root 1.1
493     my $wcb = sub {
494     my $len = syswrite $fh, $wbuf;
495    
496 root 1.9 unless (defined $len) {
497 root 1.1 if ($! != Errno::EAGAIN && $! != Errno::EWOULDBLOCK) {
498     undef $rw; undef $ww; # it ends here
499     $on_error->("$!");
500     }
501     }
502    
503     substr $wbuf, 0, $len, "";
504    
505     unless (length $wbuf) {
506     undef $ww;
507     $shutdown and shutdown $fh, 1;
508     }
509     };
510    
511     my $module = "AnyEvent::Fork::RPC::" . ($arg{async} ? "Async" : "Sync");
512    
513     $self->require ($module)
514     ->send_arg ($function, $arg{init}, $serialiser)
515     ->run ("$module\::run", sub {
516     $fh = shift;
517 root 1.9
518     my ($id, $len);
519 root 1.1 $rw = AE::io $fh, 0, sub {
520 root 1.4 $rlen = $rlen * 2 + 16 if $rlen - 128 < length $rbuf;
521 root 1.9 $len = sysread $fh, $rbuf, $rlen - length $rbuf, length $rbuf;
522 root 1.1
523     if ($len) {
524 root 1.9 while (8 <= length $rbuf) {
525     ($id, $len) = unpack "LL", $rbuf;
526     8 + $len <= length $rbuf
527 root 1.2 or last;
528    
529 root 1.9 my @r = $t->(substr $rbuf, 8, $len);
530     substr $rbuf, 0, 8 + $len, "";
531    
532     if ($id) {
533     if (@rcb) {
534     (shift @rcb)->(@r);
535     } elsif (my $cb = delete $rcb{$id}) {
536     $cb->(@r);
537     } else {
538     undef $rw; undef $ww;
539     $on_error->("unexpected data from child");
540     }
541     } else {
542 root 1.2 $on_event->(@r);
543 root 1.1 }
544     }
545     } elsif (defined $len) {
546     undef $rw; undef $ww; # it ends here
547 root 1.4
548 root 1.9 if (@rcb || %rcb) {
549 root 1.4 $on_error->("unexpected eof");
550     } else {
551     $on_destroy->();
552     }
553 root 1.1 } elsif ($! != Errno::EAGAIN && $! != Errno::EWOULDBLOCK) {
554     undef $rw; undef $ww; # it ends here
555     $on_error->("read: $!");
556     }
557     };
558    
559     $ww ||= AE::io $fh, 1, $wcb;
560     });
561    
562     my $guard = Guard::guard {
563     $shutdown = 1;
564     $ww ||= $fh && AE::io $fh, 1, $wcb;
565     };
566    
567 root 1.9 my $id;
568 root 1.1
569 root 1.9 $arg{async}
570     ? sub {
571     $id = ($id == 0xffffffff ? 0 : $id) + 1;
572     $id = ($id == 0xffffffff ? 0 : $id) + 1 while exists $rcb{$id}; # rarely loops
573 root 1.1
574 root 1.9 $rcb{$id} = pop;
575    
576     $guard; # keep it alive
577    
578     $wbuf .= pack "LL/a*", $id, &$f;
579     $ww ||= $fh && AE::io $fh, 1, $wcb;
580     }
581     : sub {
582     push @rcb, pop;
583    
584     $guard; # keep it alive
585    
586     $wbuf .= pack "L/a*", &$f;
587     $ww ||= $fh && AE::io $fh, 1, $wcb;
588     }
589 root 1.1 }
590    
591 root 1.4 =item $rpc->(..., $cb->(...))
592    
593     The RPC object returned by C<AnyEvent::Fork::RPC::run> is actually a code
594     reference. There are two things you can do with it: call it, and let it go
595     out of scope (let it get destroyed).
596    
597     If C<async> was false when C<$rpc> was created (the default), then, if you
598     call C<$rpc>, the C<$function> is invoked with all arguments passed to
599     C<$rpc> except the last one (the callback). When the function returns, the
600     callback will be invoked with all the return values.
601    
602     If C<async> was true, then the C<$function> receives an additional
603     initial argument, the result callback. In this case, returning from
604     C<$function> does nothing - the function only counts as "done" when the
605     result callback is called, and any arguments passed to it are considered
606     the return values. This makes it possible to "return" from event handlers
607     or e.g. Coro threads.
608    
609     The other thing that can be done with the RPC object is to destroy it. In
610     this case, the child process will execute all remaining RPC calls, report
611     their results, and then exit.
612    
613 root 1.8 See the examples section earlier in this document for some actual
614     examples.
615    
616 root 1.1 =back
617    
618     =head1 CHILD PROCESS USAGE
619    
620 root 1.4 The following function is not available in this module. They are only
621     available in the namespace of this module when the child is running,
622     without having to load any extra modules. They are part of the child-side
623     API of L<AnyEvent::Fork::RPC>.
624 root 1.1
625     =over 4
626    
627     =item AnyEvent::Fork::RPC::event ...
628    
629     Send an event to the parent. Events are a bit like RPC calls made by the
630     child process to the parent, except that there is no notion of return
631     values.
632    
633 root 1.8 See the examples section earlier in this document for some actual
634     examples.
635    
636 root 1.1 =back
637    
638 root 1.12 =head1 ADVANCED TOPICS
639    
640     =head2 Choosing a backend
641    
642     So how do you decide which backend to use? Well, that's your problem to
643     solve, but here are some thoughts on the matter:
644    
645     =over 4
646    
647     =item Synchronous
648    
649     The synchronous backend does not rely on any external modules (well,
650     except L<common::sense>, which works around a bug in how perl's warning
651     system works). This keeps the process very small, for example, on my
652     system, an empty perl interpreter uses 1492kB RSS, which becomes 2020kB
653     after C<use warnings; use strict> (for people who grew up with C64s around
654     them this is probably shocking every single time they see it). The worker
655     process in the first example in this document uses 1792kB.
656    
657     Since the calls are done synchronously, slow jobs will keep newer jobs
658     from executing.
659    
660     The synchronous backend also has no overhead due to running an event loop
661     - reading requests is therefore very efficient, while writing responses is
662     less so, as every response results in a write syscall.
663    
664     If the parent process is busy and a bit slow reading responses, the child
665     waits instead of processing further requests. This also limits the amount
666     of memory needed for buffering, as never more than one response has to be
667     buffered.
668    
669     The API in the child is simple - you just have to define a function that
670     does something and returns something.
671    
672     It's hard to use modules or code that relies on an event loop, as the
673     child cannot execute anything while it waits for more input.
674    
675     =item Asynchronous
676    
677     The asynchronous backend relies on L<AnyEvent>, which tries to be small,
678     but still comes at a price: On my system, the worker from example 1a uses
679     3420kB RSS (for L<AnyEvent>, which loads L<EV>, which needs L<XSLoader>
680     which in turn loads a lot of other modules such as L<warnings>, L<strict>,
681     L<vars>, L<Exporter>...).
682    
683     It batches requests and responses reasonably efficiently, doing only as
684     few reads and writes as needed, but needs to poll for events via the event
685     loop.
686    
687     Responses are queued when the parent process is busy. This means the child
688     can continue to execute any queued requests. It also means that a child
689     might queue a lot of responses in memory when it generates them and the
690     parent process is slow accepting them.
691    
692     The API is not a straightforward RPC pattern - you have to call a
693     "done" callback to pass return values and signal completion. Also, more
694     importantly, the API starts jobs as fast as possible - when 1000 jobs
695     are queued and the jobs are slow, they will all run concurrently. The
696     child must implement some queueing/limiting mechanism if this causes
697     problems. Alternatively, the parent could limit the amount of rpc calls
698     that are outstanding.
699    
700 root 1.15 Blocking use of condvars is not supported.
701    
702 root 1.12 Using event-based modules such as L<IO::AIO>, L<Gtk2>, L<Tk> and so on is
703     easy.
704    
705     =back
706    
707     =head2 Passing file descriptors
708    
709     Unlike L<AnyEvent::Fork>, this module has no in-built file handle or file
710     descriptor passing abilities.
711    
712     The reason is that passing file descriptors is extraordinary tricky
713     business, and conflicts with efficient batching of messages.
714    
715     There still is a method you can use: Create a
716     C<AnyEvent::Util::portable_socketpair> and C<send_fh> one half of it to
717     the process before you pass control to C<AnyEvent::Fork::RPC::run>.
718    
719     Whenever you want to pass a file descriptor, send an rpc request to the
720     child process (so it expects the descriptor), then send it over the other
721     half of the socketpair. The child should fetch the descriptor from the
722     half it has passed earlier.
723    
724     Here is some (untested) pseudocode to that effect:
725    
726     use AnyEvent::Util;
727     use AnyEvent::Fork::RPC;
728     use IO::FDPass;
729    
730     my ($s1, $s2) = AnyEvent::Util::portable_socketpair;
731    
732     my $rpc = AnyEvent::Fork
733     ->new
734     ->send_fh ($s2)
735     ->require ("MyWorker")
736     ->AnyEvent::Fork::RPC::run ("MyWorker::run"
737     init => "MyWorker::init",
738     );
739    
740     undef $s2; # no need to keep it around
741    
742     # pass an fd
743     $rpc->("i'll send some fd now, please expect it!", my $cv = AE::cv);
744    
745     IO::FDPass fileno $s1, fileno $handle_to_pass;
746    
747     $cv->recv;
748    
749     The MyWorker module could look like this:
750    
751     package MyWorker;
752    
753     use IO::FDPass;
754    
755     my $s2;
756    
757     sub init {
758     $s2 = $_[0];
759     }
760    
761     sub run {
762     if ($_[0] eq "i'll send some fd now, please expect it!") {
763     my $fd = IO::FDPass::recv fileno $s2;
764     ...
765     }
766     }
767    
768     Of course, this might be blocking if you pass a lot of file descriptors,
769     so you might want to look into L<AnyEvent::FDpasser> which can handle the
770     gory details.
771    
772 root 1.1 =head1 SEE ALSO
773    
774     L<AnyEvent::Fork> (to create the processes in the first place),
775     L<AnyEvent::Fork::Pool> (to manage whole pools of processes).
776    
777     =head1 AUTHOR AND CONTACT INFORMATION
778    
779     Marc Lehmann <schmorp@schmorp.de>
780     http://software.schmorp.de/pkg/AnyEvent-Fork-RPC
781    
782     =cut
783    
784     1
785