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