AnyEvent-Fork-Pool
view release on metacpan or search on metacpan
my $template = AnyEvent::Fork
->new
->require ("SomeModule", "MyWorkerModule");
my $pool = $template->AnyEvent::Fork::Pool::run ("MyWorkerModule::myfunction");
The pool "object" is not a regular Perl object, but a code reference that
you can call and that works roughly like calling the worker function
directly, except that it returns nothing but instead you need to specify a
callback to be invoked once results are in:
$pool->(1, 2, 3, sub { warn "myfunction(1,2,3) returned @_" });
=over 4
=cut
package AnyEvent::Fork::Pool;
use common::sense;
use Scalar::Util ();
use Guard ();
use Array::Heap ();
use AnyEvent;
use AnyEvent::Fork::RPC;
# these are used for the first and last argument of events
# in the hope of not colliding. yes, I don't like it either,
# but didn't come up with an obviously better alternative.
my $magic0 = ':t6Z@HK1N%Dx@_7?=~-7NQgWDdAs6a,jFN=wLO0*jD*1%P';
my $magic1 = '<~53rexz.U`!]X[A235^"fyEoiTF\T~oH1l/N6+Djep9b~bI9`\1x%B~vWO1q*';
our $VERSION = 1.3;
=item my $pool = AnyEvent::Fork::Pool::run $fork, $function, [key => value...]
The traditional way to call the pool creation function. But it is way
cooler to call it in the following way:
=item my $pool = $fork->AnyEvent::Fork::Pool::run ($function, [key => value...])
Creates a new pool object with the specified C<$function> as function
(name) to call for each request. The pool uses the C<$fork> object as the
template when creating worker processes.
You can supply your own template process, or tell C<AnyEvent::Fork::Pool>
to create one.
A relatively large number of key/value pairs can be specified to influence
the behaviour. They are grouped into the categories "pool management",
"template process" and "rpc parameters".
=over 4
=item Pool Management
The pool consists of a certain number of worker processes. These options
decide how many of these processes exist and when they are started and
stopped.
The worker pool is dynamically resized, according to (perceived :)
load. The minimum size is given by the C<idle> parameter and the maximum
size is given by the C<max> parameter. A new worker is started every
C<start> seconds at most, and an idle worker is stopped at most every
C<stop> second.
You can specify the amount of jobs sent to a worker concurrently using the
C<load> parameter.
=over 4
=item idle => $count (default: 0)
The minimum amount of idle processes in the pool - when there are fewer
than this many idle workers, C<AnyEvent::Fork::Pool> will try to start new
ones, subject to the limits set by C<max> and C<start>.
This is also the initial amount of workers in the pool. The default of
zero means that the pool starts empty and can shrink back to zero workers
over time.
=item max => $count (default: 4)
The maximum number of processes in the pool, in addition to the template
process. C<AnyEvent::Fork::Pool> will never have more than this number of
worker processes, although there can be more temporarily when a worker is
shut down and hasn't exited yet.
=item load => $count (default: 2)
The maximum number of concurrent jobs sent to a single worker process.
Jobs that cannot be sent to a worker immediately (because all workers are
busy) will be queued until a worker is available.
Setting this low improves latency. For example, at C<1>, every job that
is sent to a worker is sent to a completely idle worker that doesn't run
any other jobs. The downside is that throughput is reduced - a worker that
finishes a job needs to wait for a new job from the parent.
The default of C<2> is usually a good compromise.
=item start => $seconds (default: 0.1)
When there are fewer than C<idle> workers (or all workers are completely
busy), then a timer is started. If the timer elapses and there are still
jobs that cannot be queued to a worker, a new worker is started.
This sets the minimum time that all workers must be busy before a new
worker is started. Or, put differently, the minimum delay between starting
new workers.
The delay is small by default, which means new workers will be started
relatively quickly. A delay of C<0> is possible, and ensures that the pool
will grow as quickly as possible under load.
Non-zero values are useful to avoid "exploding" a pool because a lot of
jobs are queued in an instant.
( run in 3.227 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )