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

Comparing AnyEvent-Fork-Pool/Pool.pm (file contents):
Revision 1.11 by root, Sun Apr 28 14:19:22 2013 UTC vs.
Revision 1.15 by root, Mon Oct 27 22:24:52 2014 UTC

1=head1 NAME 1=head1 NAME
2 2
3AnyEvent::Fork::Pool - simple process pool manager on top of AnyEvent::Fork 3AnyEvent::Fork::Pool - simple process pool manager on top of AnyEvent::Fork
4 4
5THE API IS NOT FINISHED, CONSIDER THIS AN ALPHA RELEASE
6
7=head1 SYNOPSIS 5=head1 SYNOPSIS
8 6
9 use AnyEvent; 7 use AnyEvent;
8 use AnyEvent::Fork;
10 use AnyEvent::Fork::Pool; 9 use AnyEvent::Fork::Pool;
11 # use AnyEvent::Fork is not needed
12 10
13 # all possible parameters shown, with default values 11 # all possible parameters shown, with default values
14 my $pool = AnyEvent::Fork 12 my $pool = AnyEvent::Fork
15 ->new 13 ->new
16 ->require ("MyWorker") 14 ->require ("MyWorker")
43 41
44 $finish->recv; 42 $finish->recv;
45 43
46=head1 DESCRIPTION 44=head1 DESCRIPTION
47 45
48This module uses processes created via L<AnyEvent::Fork> and the RPC 46This module uses processes created via L<AnyEvent::Fork> (or
49protocol implement in L<AnyEvent::Fork::RPC> to create a load-balanced 47L<AnyEvent::Fork::Remote>) and the RPC protocol implement in
50pool of processes that handles jobs. 48L<AnyEvent::Fork::RPC> to create a load-balanced pool of processes that
49handles jobs.
51 50
52Understanding of L<AnyEvent::Fork> is helpful but not critical to be able 51Understanding of L<AnyEvent::Fork> is helpful but not critical to be able
53to use this module, but a thorough understanding of L<AnyEvent::Fork::RPC> 52to use this module, but a thorough understanding of L<AnyEvent::Fork::RPC>
54is, as it defines the actual API that needs to be implemented in the 53is, as it defines the actual API that needs to be implemented in the
55worker processes. 54worker processes.
56
57=head1 EXAMPLES
58 55
59=head1 PARENT USAGE 56=head1 PARENT USAGE
60 57
61To create a pool, you first have to create a L<AnyEvent::Fork> object - 58To create a pool, you first have to create a L<AnyEvent::Fork> object -
62this object becomes your template process. Whenever a new worker process 59this object becomes your template process. Whenever a new worker process
89 86
90use Guard (); 87use Guard ();
91use Array::Heap (); 88use Array::Heap ();
92 89
93use AnyEvent; 90use AnyEvent;
94# explicit version on next line, as some cpan-testers test with the 0.1 version,
95# ignoring dependencies, and this line will at least give a clear indication of that.
96use AnyEvent::Fork 0.6; # we don't actually depend on it, this is for convenience
97use AnyEvent::Fork::RPC; 91use AnyEvent::Fork::RPC;
98 92
99# these are used for the first and last argument of events 93# these are used for the first and last argument of events
100# in the hope of not colliding. yes, I don't like it either, 94# in the hope of not colliding. yes, I don't like it either,
101# but didn't come up with an obviously better alternative. 95# but didn't come up with an obviously better alternative.
102my $magic0 = ':t6Z@HK1N%Dx@_7?=~-7NQgWDdAs6a,jFN=wLO0*jD*1%P'; 96my $magic0 = ':t6Z@HK1N%Dx@_7?=~-7NQgWDdAs6a,jFN=wLO0*jD*1%P';
103my $magic1 = '<~53rexz.U`!]X[A235^"fyEoiTF\T~oH1l/N6+Djep9b~bI9`\1x%B~vWO1q*'; 97my $magic1 = '<~53rexz.U`!]X[A235^"fyEoiTF\T~oH1l/N6+Djep9b~bI9`\1x%B~vWO1q*';
104 98
105our $VERSION = 1.1; 99our $VERSION = 1.2;
106 100
107=item my $pool = AnyEvent::Fork::Pool::run $fork, $function, [key => value...] 101=item my $pool = AnyEvent::Fork::Pool::run $fork, $function, [key => value...]
108 102
109The traditional way to call the pool creation function. But it is way 103The traditional way to call the pool creation function. But it is way
110cooler to call it in the following way: 104cooler to call it in the following way:
403 397
404 last; 398 last;
405 } 399 }
406 } 400 }
407 } elsif ($shutdown) { 401 } elsif ($shutdown) {
408 @pool = (); 402 undef $_->[2]
403 for @pool;
404
409 undef $start_w; 405 undef $start_w;
410 undef $start_worker; # frees $destroy_guard reference 406 undef $start_worker; # frees $destroy_guard reference
411 407
412 $stop_worker->($pool[0]) 408 $stop_worker->($pool[0])
413 while $nidle; 409 while $nidle;
452 448
453=item $cpus = AnyEvent::Fork::Pool::ncpu [$default_cpus] 449=item $cpus = AnyEvent::Fork::Pool::ncpu [$default_cpus]
454 450
455=item ($cpus, $eus) = AnyEvent::Fork::Pool::ncpu [$default_cpus] 451=item ($cpus, $eus) = AnyEvent::Fork::Pool::ncpu [$default_cpus]
456 452
457Tries to detect the number of CPUs (C<$cpus> often called cpu cores 453Tries to detect the number of CPUs (C<$cpus> often called CPU cores
458nowadays) and execution units (C<$eus>) which include e.g. extra 454nowadays) and execution units (C<$eus>) which include e.g. extra
459hyperthreaded units). When C<$cpus> cannot be determined reliably, 455hyperthreaded units). When C<$cpus> cannot be determined reliably,
460C<$default_cpus> is returned for both values, or C<1> if it is missing. 456C<$default_cpus> is returned for both values, or C<1> if it is missing.
461 457
462For normal CPU bound uses, it is wise to have as many worker processes 458For normal CPU bound uses, it is wise to have as many worker processes
464hyperthreading is usually detrimental to performance, but in those rare 460hyperthreading is usually detrimental to performance, but in those rare
465cases where that really helps it might be beneficial to use more workers 461cases where that really helps it might be beneficial to use more workers
466(C<$eus>). 462(C<$eus>).
467 463
468Currently, F</proc/cpuinfo> is parsed on GNU/Linux systems for both 464Currently, F</proc/cpuinfo> is parsed on GNU/Linux systems for both
469C<$cpus> and C<$eu>, and on {Free,Net,Open}BSD, F<sysctl -n hw.ncpu> is 465C<$cpus> and C<$eus>, and on {Free,Net,Open}BSD, F<sysctl -n hw.ncpu> is
470used for C<$cpus>. 466used for C<$cpus>.
471 467
472Example: create a worker pool with as many workers as cpu cores, or C<2>, 468Example: create a worker pool with as many workers as CPU cores, or C<2>,
473if the actual number could not be determined. 469if the actual number could not be determined.
474 470
475 $fork->AnyEvent::Fork::Pool::run ("myworker::function", 471 $fork->AnyEvent::Fork::Pool::run ("myworker::function",
476 max => (scalar AnyEvent::Fork::Pool::ncpu 2), 472 max => (scalar AnyEvent::Fork::Pool::ncpu 2),
477 ); 473 );
524 520
525=item AnyEvent::Fork::Pool::retire () 521=item AnyEvent::Fork::Pool::retire ()
526 522
527This function sends an event to the parent process to request retirement: 523This function sends an event to the parent process to request retirement:
528the worker is removed from the pool and no new jobs will be sent to it, 524the worker is removed from the pool and no new jobs will be sent to it,
529but it has to handle the jobs that are already queued. 525but it still has to handle the jobs that are already queued.
530 526
531The parentheses are part of the syntax: the function usually isn't defined 527The parentheses are part of the syntax: the function usually isn't defined
532when you compile your code (because that happens I<before> handing the 528when you compile your code (because that happens I<before> handing the
533template process over to C<AnyEvent::Fork::Pool::run>, so you need the 529template process over to C<AnyEvent::Fork::Pool::run>, so you need the
534empty parentheses to tell Perl that the function is indeed a function. 530empty parentheses to tell Perl that the function is indeed a function.
535 531
536Retiring a worker can be useful to gracefully shut it down when the worker 532Retiring a worker can be useful to gracefully shut it down when the worker
537deems this useful. For example, after executing a job, one could check 533deems this useful. For example, after executing a job, it could check the
538the process size or the number of jobs handled so far, and if either is 534process size or the number of jobs handled so far, and if either is too
539too high, the worker could ask to get retired, to avoid memory leaks to 535high, the worker could request to be retired, to avoid memory leaks to
540accumulate. 536accumulate.
541 537
542Example: retire a worker after it has handled roughly 100 requests. 538Example: retire a worker after it has handled roughly 100 requests. It
539doesn't matter whether you retire at the beginning or end of your request,
540as the worker will continue to handle some outstanding requests. Likewise,
541it's ok to call retire multiple times.
543 542
544 my $count = 0; 543 my $count = 0;
545 544
546 sub my::worker { 545 sub my::worker {
547 546
553 552
554=back 553=back
555 554
556=head1 POOL PARAMETERS RECIPES 555=head1 POOL PARAMETERS RECIPES
557 556
558This section describes some recipes for pool paramaters. These are mostly 557This section describes some recipes for pool parameters. These are mostly
559meant for the synchronous RPC backend, as the asynchronous RPC backend 558meant for the synchronous RPC backend, as the asynchronous RPC backend
560changes the rules considerably, making workers themselves responsible for 559changes the rules considerably, making workers themselves responsible for
561their scheduling. 560their scheduling.
562 561
563=over 4 562=over 4
592=item high throughput, I/O bound jobs - set load >= 2, max = 1, or very high 591=item high throughput, I/O bound jobs - set load >= 2, max = 1, or very high
593 592
594When your jobs are I/O bound, using more workers usually boils down to 593When your jobs are I/O bound, using more workers usually boils down to
595higher throughput, depending very much on your actual workload - sometimes 594higher throughput, depending very much on your actual workload - sometimes
596having only one worker is best, for example, when you read or write big 595having only one worker is best, for example, when you read or write big
597files at maixmum speed, as a second worker will increase seek times. 596files at maximum speed, as a second worker will increase seek times.
598 597
599=back 598=back
600 599
601=head1 EXCEPTIONS 600=head1 EXCEPTIONS
602 601
603The same "policy" as with L<AnyEvent::Fork::RPC> applies - exceptins will 602The same "policy" as with L<AnyEvent::Fork::RPC> applies - exceptions
604not be caught, and exceptions in both worker and in callbacks causes 603will not be caught, and exceptions in both worker and in callbacks causes
605undesirable or undefined behaviour. 604undesirable or undefined behaviour.
606 605
607=head1 SEE ALSO 606=head1 SEE ALSO
608 607
609L<AnyEvent::Fork>, to create the processes in the first place. 608L<AnyEvent::Fork>, to create the processes in the first place.
609
610L<AnyEvent::Fork::Remote>, likewise, but helpful for remote processes.
610 611
611L<AnyEvent::Fork::RPC>, which implements the RPC protocol and API. 612L<AnyEvent::Fork::RPC>, which implements the RPC protocol and API.
612 613
613=head1 AUTHOR AND CONTACT INFORMATION 614=head1 AUTHOR AND CONTACT INFORMATION
614 615

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines