Sub::Throttle - Throttle load of perl function


Sub-Throttle documentation Contained in the Sub-Throttle distribution.

Index


Code Index:

NAME

Top

Sub::Throttle - Throttle load of perl function

SYNOPSIS

Top

  use Sub::Throttle qw(throttle);

  my $load = 0.1;

  throttle($load, sub { ... });
  throttle($load, \&subref, @args);

DESCRIPTION

Top

Throttles the load of perl function by calling sleep.

METHODS

Top

throttle($load, $subref [, @subargs])

Calls sleep after executing $subref with given @subargs so that the ratio of execution time becomes equal to $load.

AUTHOR

Top

Kazuho Oku <kazuhooku at gmail.com>

COPYRIGHT AND LICENSE

Top


Sub-Throttle documentation Contained in the Sub-Throttle distribution.

package Sub::Throttle;

use strict;
use warnings;

use Carp qw(croak);
use List::Util qw(max);
use Time::HiRes qw(time sleep);

require Exporter;

our @ISA = qw(Exporter);
our @EXPORT_OK = qw(throttle);
our %EXPORT_TAGS = (
    all => [ @EXPORT_OK ],
);
our @EXPORT = ();
our $VERSION = '0.02';

sub throttle {
    croak "too few arguments to throttle\n"
        if @_ < 2;
    my ($load, $func, @args) = @_;
    my @ret;
    my $start = time;
    if (wantarray) {
        @ret = $func->(@args);
    } else {
        $ret[0] = $func->(@args);
    }
    sleep(_sleep_secs($load, time - $start));
    wantarray ? @ret : $ret[0];
}

sub _sleep_secs {
    my ($load, $elapsed) = @_;
    max($elapsed, 0) * (1 - $load) / $load;
}

1;