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