ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-Fork-RPC/RPC.pm
(Generate patch)

Comparing AnyEvent-Fork-RPC/RPC.pm (file contents):
Revision 1.11 by root, Thu Apr 18 07:59:46 2013 UTC vs.
Revision 1.16 by root, Thu Apr 18 14:07:15 2013 UTC

11 ->new 11 ->new
12 ->require ("MyModule") 12 ->require ("MyModule")
13 ->AnyEvent::Fork::RPC::run ( 13 ->AnyEvent::Fork::RPC::run (
14 "MyModule::server", 14 "MyModule::server",
15 ); 15 );
16
17 use AnyEvent;
16 18
17 my $cv = AE::cv; 19 my $cv = AE::cv;
18 20
19 $rpc->(1, 2, 3, sub { 21 $rpc->(1, 2, 3, sub {
20 print "MyModule::server returned @_\n"; 22 print "MyModule::server returned @_\n";
372 374
373The default server used in the child does all I/O blockingly, and only 375The default server used in the child does all I/O blockingly, and only
374allows a single RPC call to execute concurrently. 376allows a single RPC call to execute concurrently.
375 377
376Setting C<async> to a true value switches to another implementation that 378Setting C<async> to a true value switches to another implementation that
377uses L<AnyEvent> in the child and allows multiple concurrent RPC calls. 379uses L<AnyEvent> in the child and allows multiple concurrent RPC calls (it
380does not support recursion in the event loop however, blocking condvar
381calls will fail).
378 382
379The actual API in the child is documented in the section that describes 383The actual API in the child is documented in the section that describes
380the calling semantics of the returned C<$rpc> function. 384the calling semantics of the returned C<$rpc> function.
381 385
382If you want to pre-load the actual back-end modules to enable memory 386If you want to pre-load the actual back-end modules to enable memory
384synchronous, and C<AnyEvent::Fork::RPC::Async> for asynchronous mode. 388synchronous, and C<AnyEvent::Fork::RPC::Async> for asynchronous mode.
385 389
386If you use a template process and want to fork both sync and async 390If you use a template process and want to fork both sync and async
387children, then it is permissible to load both modules. 391children, then it is permissible to load both modules.
388 392
389=item serialiser => $string (default: '(sub { pack "(w/a*)*", @_ }, sub { unpack "(w/a*)*", shift })') 393=item serialiser => $string (default: $AnyEvent::Fork::RPC::STRING_SERIALISER)
390 394
391All arguments, result data and event data have to be serialised to be 395All arguments, result data and event data have to be serialised to be
392transferred between the processes. For this, they have to be frozen and 396transferred between the processes. For this, they have to be frozen and
393thawed in both parent and child processes. 397thawed in both parent and child processes.
394 398
395By default, only octet strings can be passed between the processes, which 399By default, only octet strings can be passed between the processes, which
396is reasonably fast and efficient. 400is reasonably fast and efficient and requires no extra modules.
397 401
398For more complicated use cases, you can provide your own freeze and thaw 402For more complicated use cases, you can provide your own freeze and thaw
399functions, by specifying a string with perl source code. It's supposed to 403functions, by specifying a string with perl source code. It's supposed to
400return two code references when evaluated: the first receives a list of 404return two code references when evaluated: the first receives a list of
401perl values and must return an octet string. The second receives the octet 405perl values and must return an octet string. The second receives the octet
403 407
404If you need an external module for serialisation, then you can either 408If you need an external module for serialisation, then you can either
405pre-load it into your L<AnyEvent::Fork> process, or you can add a C<use> 409pre-load it into your L<AnyEvent::Fork> process, or you can add a C<use>
406or C<require> statement into the serialiser string. Or both. 410or C<require> statement into the serialiser string. Or both.
407 411
412Here are some examples - some of them are also available as global
413variables that make them easier to use.
414
415=over 4
416
417=item octet strings - C<$AnyEvent::Fork::RPC::STRING_SERIALISER>
418
419This serialiser concatenates length-prefixes octet strings, and is the
420default.
421
422Implementation:
423
424 (
425 sub { pack "(w/a*)*", @_ },
426 sub { unpack "(w/a*)*", shift }
427 )
428
429=item json - C<$AnyEvent::Fork::RPC::JSON_SERIALISER>
430
431This serialiser creates JSON arrays - you have to make sure the L<JSON>
432module is installed for this serialiser to work. It can be beneficial for
433sharing when you preload the L<JSON> module in a template process.
434
435L<JSON> (with L<JSON::XS> installed) is slower than the octet string
436serialiser, but usually much faster than L<Storable>, unless big chunks of
437binary data need to be transferred.
438
439Implementation:
440
441 use JSON ();
442 (
443 sub { JSON::encode_json \@_ },
444 sub { @{ JSON::decode_json shift } }
445 )
446
447=item storable - C<$AnyEvent::Fork::RPC::STORABLE_SERIALISER>
448
449This serialiser uses L<Storable>, which means it has high chance of
450serialising just about anything you throw at it, at the cost of having
451very high overhead per operation. It also comes with perl.
452
453Implementation:
454
455 use Storable ();
456 (
457 sub { Storable::freeze \@_ },
458 sub { @{ Storable::thaw shift } }
459 )
460
461=back
462
408=back 463=back
409 464
410See the examples section earlier in this document for some actual 465See the examples section earlier in this document for some actual
411examples. 466examples.
412 467
413=cut 468=cut
414 469
415our $STRING_SERIALISER = '(sub { pack "(w/a*)*", @_ }, sub { unpack "(w/a*)*", shift })'; 470our $STRING_SERIALISER = '(sub { pack "(w/a*)*", @_ }, sub { unpack "(w/a*)*", shift })';
471our $JSON_SERIALISER = 'use JSON (); (sub { JSON::encode_json \@_ }, sub { @{ JSON::decode_json shift } })';
472our $STORABLE_SERIALISER = 'use Storable (); (sub { Storable::freeze \@_ }, sub { @{ Storable::thaw shift } })';
416 473
417sub run { 474sub run {
418 my ($self, $function, %arg) = @_; 475 my ($self, $function, %arg) = @_;
419 476
420 my $serialiser = delete $arg{serialiser} || $STRING_SERIALISER; 477 my $serialiser = delete $arg{serialiser} || $STRING_SERIALISER;
489 } 546 }
490 } elsif (defined $len) { 547 } elsif (defined $len) {
491 undef $rw; undef $ww; # it ends here 548 undef $rw; undef $ww; # it ends here
492 549
493 if (@rcb || %rcb) { 550 if (@rcb || %rcb) {
494 use Data::Dump;ddx[\@rcb,\%rcb];#d#
495 $on_error->("unexpected eof"); 551 $on_error->("unexpected eof");
496 } else { 552 } else {
497 $on_destroy->(); 553 $on_destroy->();
498 } 554 }
499 } elsif ($! != Errno::EAGAIN && $! != Errno::EWOULDBLOCK) { 555 } elsif ($! != Errno::EAGAIN && $! != Errno::EWOULDBLOCK) {
579See the examples section earlier in this document for some actual 635See the examples section earlier in this document for some actual
580examples. 636examples.
581 637
582=back 638=back
583 639
640=head1 ADVANCED TOPICS
641
642=head2 Choosing a backend
643
644So how do you decide which backend to use? Well, that's your problem to
645solve, but here are some thoughts on the matter:
646
647=over 4
648
649=item Synchronous
650
651The synchronous backend does not rely on any external modules (well,
652except L<common::sense>, which works around a bug in how perl's warning
653system works). This keeps the process very small, for example, on my
654system, an empty perl interpreter uses 1492kB RSS, which becomes 2020kB
655after C<use warnings; use strict> (for people who grew up with C64s around
656them this is probably shocking every single time they see it). The worker
657process in the first example in this document uses 1792kB.
658
659Since the calls are done synchronously, slow jobs will keep newer jobs
660from executing.
661
662The synchronous backend also has no overhead due to running an event loop
663- reading requests is therefore very efficient, while writing responses is
664less so, as every response results in a write syscall.
665
666If the parent process is busy and a bit slow reading responses, the child
667waits instead of processing further requests. This also limits the amount
668of memory needed for buffering, as never more than one response has to be
669buffered.
670
671The API in the child is simple - you just have to define a function that
672does something and returns something.
673
674It's hard to use modules or code that relies on an event loop, as the
675child cannot execute anything while it waits for more input.
676
677=item Asynchronous
678
679The asynchronous backend relies on L<AnyEvent>, which tries to be small,
680but still comes at a price: On my system, the worker from example 1a uses
6813420kB RSS (for L<AnyEvent>, which loads L<EV>, which needs L<XSLoader>
682which in turn loads a lot of other modules such as L<warnings>, L<strict>,
683L<vars>, L<Exporter>...).
684
685It batches requests and responses reasonably efficiently, doing only as
686few reads and writes as needed, but needs to poll for events via the event
687loop.
688
689Responses are queued when the parent process is busy. This means the child
690can continue to execute any queued requests. It also means that a child
691might queue a lot of responses in memory when it generates them and the
692parent process is slow accepting them.
693
694The API is not a straightforward RPC pattern - you have to call a
695"done" callback to pass return values and signal completion. Also, more
696importantly, the API starts jobs as fast as possible - when 1000 jobs
697are queued and the jobs are slow, they will all run concurrently. The
698child must implement some queueing/limiting mechanism if this causes
699problems. Alternatively, the parent could limit the amount of rpc calls
700that are outstanding.
701
702Blocking use of condvars is not supported.
703
704Using event-based modules such as L<IO::AIO>, L<Gtk2>, L<Tk> and so on is
705easy.
706
707=back
708
709=head2 Passing file descriptors
710
711Unlike L<AnyEvent::Fork>, this module has no in-built file handle or file
712descriptor passing abilities.
713
714The reason is that passing file descriptors is extraordinary tricky
715business, and conflicts with efficient batching of messages.
716
717There still is a method you can use: Create a
718C<AnyEvent::Util::portable_socketpair> and C<send_fh> one half of it to
719the process before you pass control to C<AnyEvent::Fork::RPC::run>.
720
721Whenever you want to pass a file descriptor, send an rpc request to the
722child process (so it expects the descriptor), then send it over the other
723half of the socketpair. The child should fetch the descriptor from the
724half it has passed earlier.
725
726Here is some (untested) pseudocode to that effect:
727
728 use AnyEvent::Util;
729 use AnyEvent::Fork::RPC;
730 use IO::FDPass;
731
732 my ($s1, $s2) = AnyEvent::Util::portable_socketpair;
733
734 my $rpc = AnyEvent::Fork
735 ->new
736 ->send_fh ($s2)
737 ->require ("MyWorker")
738 ->AnyEvent::Fork::RPC::run ("MyWorker::run"
739 init => "MyWorker::init",
740 );
741
742 undef $s2; # no need to keep it around
743
744 # pass an fd
745 $rpc->("i'll send some fd now, please expect it!", my $cv = AE::cv);
746
747 IO::FDPass fileno $s1, fileno $handle_to_pass;
748
749 $cv->recv;
750
751The MyWorker module could look like this:
752
753 package MyWorker;
754
755 use IO::FDPass;
756
757 my $s2;
758
759 sub init {
760 $s2 = $_[0];
761 }
762
763 sub run {
764 if ($_[0] eq "i'll send some fd now, please expect it!") {
765 my $fd = IO::FDPass::recv fileno $s2;
766 ...
767 }
768 }
769
770Of course, this might be blocking if you pass a lot of file descriptors,
771so you might want to look into L<AnyEvent::FDpasser> which can handle the
772gory details.
773
584=head1 SEE ALSO 774=head1 SEE ALSO
585 775
586L<AnyEvent::Fork> (to create the processes in the first place), 776L<AnyEvent::Fork>, to create the processes in the first place.
777
587L<AnyEvent::Fork::Pool> (to manage whole pools of processes). 778L<AnyEvent::Fork::Pool>, to manage whole pools of processes.
588 779
589=head1 AUTHOR AND CONTACT INFORMATION 780=head1 AUTHOR AND CONTACT INFORMATION
590 781
591 Marc Lehmann <schmorp@schmorp.de> 782 Marc Lehmann <schmorp@schmorp.de>
592 http://software.schmorp.de/pkg/AnyEvent-Fork-RPC 783 http://software.schmorp.de/pkg/AnyEvent-Fork-RPC

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines