IO::Lambda::Throttle - rate-limiting facility
Provides several interfaces for throttling control flow by imposing rate limit.
use IO::Lambda qw(:lambda); use IO::Lambda::Throttle qw(throttle); # execute 2 lambdas a sec - blocking throttle(2)-> wait(@lambdas); # non-blocking lambda { context throttle(2), @lambdas; tail {}; }; # share a rate-limiter between two sets of lambdas running in parallel # strictly 1 lambda in 10 seconds will be executed my $t = IO::Lambda::Throttle-> new(0.1); # throttle lambdas sequentially sub track { my @lambdas = @_; return lambda { context $t-> ratelimit, @lambdas; tail {}; }; } # parallel two tracks - execution order will be # $a[0], $b[0], $a[1], $b[1], etc lambda { context track(@a), track(@b); tails {} }-> wait;
The constructor creates a new rate-limiter object. The object methods (see below) generate lambdas that allow to execute lambdas with a given rate and algorithm. See rate and strict for description.
strict
$rate is given in lambda/seconds, and means infinity if is 0.
$rate
$strict selects between fair and aggressive throttling . For example, if rate is 5 l/s, and first 5 lambdas all come within first 0.1 sec. With $strict 0, all af them will be scheduled to execution immediately, but the 6th lambda will be delayed to 1.2 sec. With $strict 1, all lambdas will be scheduled to be executed evenly with 0.2 sec delay.
$strict
Internal function, called when code needs to determine whether lambda is allowed to run immediately (function returns 0) or after a timeout (returns non-zero value). If a non-zero value is returned, it is guaranteed that after sleeping this time, next invocation of the function will return 0.
Override the function for your own implementation of rate-limiting function.
Returns a lambda that will execute when rate-limiter allows next execution:
context $throttle-> lock; tail { ... do something ... }
The lambda can be reused.
Returns a lambda that finishes when all passed @lambdas are finished. Executes them one by one, imposing a rate limit. Returns results of lambdas accumulated in a list.
Condition version of new($rate,$strict)-> ratelimit
new($rate,$strict)-> ratelimit
Dmitry Karasik, <dmitry@karasik.eu.org>.
To install IO::Lambda, copy and paste the appropriate command in to your terminal.
cpanm
cpanm IO::Lambda
CPAN shell
perl -MCPAN -e shell install IO::Lambda
For more information on module installation, please visit the detailed CPAN module installation guide.