ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-Fork-RPC/RPC.pm
Revision: 1.26
Committed: Sun Apr 28 14:27:11 2013 UTC (11 years, 1 month ago) by root
Branch: MAIN
Changes since 1.25: +5 -4 lines
Log Message:
*** empty log message ***

File Contents

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