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

Comparing AnyEvent-Fork/Fork.pm (file contents):
Revision 1.33 by root, Sat Apr 6 09:34:11 2013 UTC vs.
Revision 1.39 by root, Sat Apr 6 22:39:37 2013 UTC

27 27
28Special care has been taken to make this module useful from other modules, 28Special care has been taken to make this module useful from other modules,
29while still supporting specialised environments such as L<App::Staticperl> 29while still supporting specialised environments such as L<App::Staticperl>
30or L<PAR::Packer>. 30or L<PAR::Packer>.
31 31
32=head1 WHAT THIS MODULE IS NOT 32=head2 WHAT THIS MODULE IS NOT
33 33
34This module only creates processes and lets you pass file handles and 34This module only creates processes and lets you pass file handles and
35strings to it, and run perl code. It does not implement any kind of RPC - 35strings to it, and run perl code. It does not implement any kind of RPC -
36there is no back channel from the process back to you, and there is no RPC 36there is no back channel from the process back to you, and there is no RPC
37or message passing going on. 37or message passing going on.
40in whatever way you like, use some message-passing module such 40in whatever way you like, use some message-passing module such
41as L<AnyEvent::MP>, some pipe such as L<AnyEvent::ZeroMQ>, use 41as L<AnyEvent::MP>, some pipe such as L<AnyEvent::ZeroMQ>, use
42L<AnyEvent::Handle> on both sides to send e.g. JSON or Storable messages, 42L<AnyEvent::Handle> on both sides to send e.g. JSON or Storable messages,
43and so on. 43and so on.
44 44
45=head2 COMPARISON TO OTHER MODULES
46
47There is an abundance of modules on CPAN that do "something fork", such as
48L<Parallel::ForkManager>, L<AnyEvent::ForkManager>, L<AnyEvent::Worker>
49or L<AnyEvent::Subprocess>. There are modules that implement their own
50process management, such as L<AnyEvent::DBI>.
51
52The problems that all these modules try to solve are real, however, none
53of them (from what I have seen) tackle the very real problems of unwanted
54memory sharing, efficiency, not being able to use event processing or
55similar modules in the processes they create.
56
57This module doesn't try to replace any of them - instead it tries to solve
58the problem of creating processes with a minimum of fuss and overhead (and
59also luxury). Ideally, most of these would use AnyEvent::Fork internally,
60except they were written before AnyEvent:Fork was available, so obviously
61had to roll their own.
62
45=head1 PROBLEM STATEMENT 63=head2 PROBLEM STATEMENT
46 64
47There are two traditional ways to implement parallel processing on UNIX 65There are two traditional ways to implement parallel processing on UNIX
48like operating systems - fork and process, and fork+exec and process. They 66like operating systems - fork and process, and fork+exec and process. They
49have different advantages and disadvantages that I describe below, 67have different advantages and disadvantages that I describe below,
50together with how this module tries to mitigate the disadvantages. 68together with how this module tries to mitigate the disadvantages.
591 609
592If you want to execute some code (that isn't in a module) to take over the 610If you want to execute some code (that isn't in a module) to take over the
593process, you should compile a function via C<eval> first, and then call 611process, you should compile a function via C<eval> first, and then call
594it via C<run>. This also gives you access to any arguments passed via the 612it via C<run>. This also gives you access to any arguments passed via the
595C<send_xxx> methods, such as file handles. See the L<use AnyEvent::Fork as 613C<send_xxx> methods, such as file handles. See the L<use AnyEvent::Fork as
596a faster fork+exec> example. 614a faster fork+exec> example to see it in action.
597 615
598Returns the process object for easy chaining of method calls. 616Returns the process object for easy chaining of method calls.
599 617
600=cut 618=cut
601 619
627=item $proc = $proc->send_fh ($handle, ...) 645=item $proc = $proc->send_fh ($handle, ...)
628 646
629Send one or more file handles (I<not> file descriptors) to the process, 647Send one or more file handles (I<not> file descriptors) to the process,
630to prepare a call to C<run>. 648to prepare a call to C<run>.
631 649
632The process object keeps a reference to the handles until this is done, 650The process object keeps a reference to the handles until they have
633so you must not explicitly close the handles. This is most easily 651been passed over to the process, so you must not explicitly close the
634accomplished by simply not storing the file handles anywhere after passing 652handles. This is most easily accomplished by simply not storing the file
635them to this method. 653handles anywhere after passing them to this method - when AnyEvent::Fork
654is finished using them, perl will automatically close them.
636 655
637Returns the process object for easy chaining of method calls. 656Returns the process object for easy chaining of method calls.
638 657
639Example: pass a file handle to a process, and release it without 658Example: pass a file handle to a process, and release it without
640closing. It will be closed automatically when it is no longer used. 659closing. It will be closed automatically when it is no longer used.
656} 675}
657 676
658=item $proc = $proc->send_arg ($string, ...) 677=item $proc = $proc->send_arg ($string, ...)
659 678
660Send one or more argument strings to the process, to prepare a call to 679Send one or more argument strings to the process, to prepare a call to
661C<run>. The strings can be any octet string. 680C<run>. The strings can be any octet strings.
662 681
663The protocol is optimised to pass a moderate number of relatively short 682The protocol is optimised to pass a moderate number of relatively short
664strings - while you can pass up to 4GB of data in one go, this is more 683strings - while you can pass up to 4GB of data in one go, this is more
665meant to pass some ID information or other startup info, not big chunks of 684meant to pass some ID information or other startup info, not big chunks of
666data. 685data.
682Enter the function specified by the function name in C<$func> in the 701Enter the function specified by the function name in C<$func> in the
683process. The function is called with the communication socket as first 702process. The function is called with the communication socket as first
684argument, followed by all file handles and string arguments sent earlier 703argument, followed by all file handles and string arguments sent earlier
685via C<send_fh> and C<send_arg> methods, in the order they were called. 704via C<send_fh> and C<send_arg> methods, in the order they were called.
686 705
706The process object becomes unusable on return from this function - any
707further method calls result in undefined behaviour.
708
687The function name should be fully qualified, but if it isn't, it will be 709The function name should be fully qualified, but if it isn't, it will be
688looked up in the main package. 710looked up in the C<main> package.
689 711
690If the called function returns, doesn't exist, or any error occurs, the 712If the called function returns, doesn't exist, or any error occurs, the
691process exits. 713process exits.
692 714
693Preparing the process is done in the background - when all commands have 715Preparing the process is done in the background - when all commands have
694been sent, the callback is invoked with the local communications socket 716been sent, the callback is invoked with the local communications socket
695as argument. At this point you can start using the socket in any way you 717as argument. At this point you can start using the socket in any way you
696like. 718like.
697
698The process object becomes unusable on return from this function - any
699further method calls result in undefined behaviour.
700 719
701If the communication socket isn't used, it should be closed on both sides, 720If the communication socket isn't used, it should be closed on both sides,
702to save on kernel memory. 721to save on kernel memory.
703 722
704The socket is non-blocking in the parent, and blocking in the newly 723The socket is non-blocking in the parent, and blocking in the newly
779 479 vfork+execs per second, using AnyEvent::Fork->new_exec 798 479 vfork+execs per second, using AnyEvent::Fork->new_exec
780 799
781So how can C<< AnyEvent->new >> be faster than a standard fork, even 800So how can C<< AnyEvent->new >> be faster than a standard fork, even
782though it uses the same operations, but adds a lot of overhead? 801though it uses the same operations, but adds a lot of overhead?
783 802
784The difference is simply the process size: forking the 6MB process takes 803The difference is simply the process size: forking the 5MB process takes
785so much longer than forking the 2.5MB template process that the overhead 804so much longer than forking the 2.5MB template process that the extra
786introduced is canceled out. 805overhead introduced is canceled out.
787 806
788If the benchmark process grows, the normal fork becomes even slower: 807If the benchmark process grows, the normal fork becomes even slower:
789 808
790 1340 new processes, manual fork in a 20MB process 809 1340 new processes, manual fork of a 20MB process
791 731 new processes, manual fork in a 200MB process 810 731 new processes, manual fork of a 200MB process
792 235 new processes, manual fork in a 2000MB process 811 235 new processes, manual fork of a 2000MB process
793 812
794What that means (to me) is that I can use this module without having a 813What that means (to me) is that I can use this module without having a bad
795very bad conscience because of the extra overhead required to start new 814conscience because of the extra overhead required to start new processes.
796processes.
797 815
798=head1 TYPICAL PROBLEMS 816=head1 TYPICAL PROBLEMS
799 817
800This section lists typical problems that remain. I hope by recognising 818This section lists typical problems that remain. I hope by recognising
801them, most can be avoided. 819them, most can be avoided.
802 820
803=over 4 821=over 4
804 822
805=item "leaked" file descriptors for exec'ed processes 823=item leaked file descriptors for exec'ed processes
806 824
807POSIX systems inherit file descriptors by default when exec'ing a new 825POSIX systems inherit file descriptors by default when exec'ing a new
808process. While perl itself laudably sets the close-on-exec flags on new 826process. While perl itself laudably sets the close-on-exec flags on new
809file handles, most C libraries don't care, and even if all cared, it's 827file handles, most C libraries don't care, and even if all cared, it's
810often not possible to set the flag in a race-free manner. 828often not possible to set the flag in a race-free manner.
830libraries or the code that leaks those file descriptors. 848libraries or the code that leaks those file descriptors.
831 849
832Fortunately, most of these leaked descriptors do no harm, other than 850Fortunately, most of these leaked descriptors do no harm, other than
833sitting on some resources. 851sitting on some resources.
834 852
835=item "leaked" file descriptors for fork'ed processes 853=item leaked file descriptors for fork'ed processes
836 854
837Normally, L<AnyEvent::Fork> does start new processes by exec'ing them, 855Normally, L<AnyEvent::Fork> does start new processes by exec'ing them,
838which closes file descriptors not marked for being inherited. 856which closes file descriptors not marked for being inherited.
839 857
840However, L<AnyEvent::Fork::Early> and L<AnyEvent::Fork::Template> offer 858However, L<AnyEvent::Fork::Early> and L<AnyEvent::Fork::Template> offer
849 867
850The solution is to either not load these modules before use'ing 868The solution is to either not load these modules before use'ing
851L<AnyEvent::Fork::Early> or L<AnyEvent::Fork::Template>, or to delay 869L<AnyEvent::Fork::Early> or L<AnyEvent::Fork::Template>, or to delay
852initialising them, for example, by calling C<init Gtk2> manually. 870initialising them, for example, by calling C<init Gtk2> manually.
853 871
854=item exit runs destructors 872=item exiting calls object destructors
855 873
856This only applies to users of Lc<AnyEvent::Fork:Early> and 874This only applies to users of L<AnyEvent::Fork:Early> and
857L<AnyEvent::Fork::Template>. 875L<AnyEvent::Fork::Template>, or when initialiasing code creates objects
876that reference external resources.
858 877
859When a process created by AnyEvent::Fork exits, it might do so by calling 878When a process created by AnyEvent::Fork exits, it might do so by calling
860exit, or simply letting perl reach the end of the program. At which point 879exit, or simply letting perl reach the end of the program. At which point
861Perl runs all destructors. 880Perl runs all destructors.
862 881
881to make it so, mostly due to the bloody broken perl that nobody seems to 900to make it so, mostly due to the bloody broken perl that nobody seems to
882care about. The fork emulation is a bad joke - I have yet to see something 901care about. The fork emulation is a bad joke - I have yet to see something
883useful that you can do with it without running into memory corruption 902useful that you can do with it without running into memory corruption
884issues or other braindamage. Hrrrr. 903issues or other braindamage. Hrrrr.
885 904
886Cygwin perl is not supported at the moment, as it should implement fd 905Cygwin perl is not supported at the moment due to some hilarious
887passing, but doesn't, and rolling my own is hard, as cygwin doesn't 906shortcomings of its API - see L<IO::FDPoll> for more details.
888support enough functionality to do it.
889 907
890=head1 SEE ALSO 908=head1 SEE ALSO
891 909
892L<AnyEvent::Fork::Early> (to avoid executing a perl interpreter), 910L<AnyEvent::Fork::Early> (to avoid executing a perl interpreter),
893L<AnyEvent::Fork::Template> (to create a process by forking the main 911L<AnyEvent::Fork::Template> (to create a process by forking the main

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines