Perl token bucket rate limiter
Perl
use strict;
use warnings;
use Time::HiRes qw(time);
sub token_bucket {
my ($rate, $burst) = @_;
my ($tokens, $ts) = ($burst, time());
return sub {
my ($n) = @_;
$n //= 1;
my $now = time();
$tokens += ($now - $ts) * $rate;
$tokens = $burst if $tokens > $burst;
$ts = $now;
return 0 if $tokens < $n;
$tokens -= $n;
return 1;
};
}
my $take = token_bucket(2, 3);
print $take->() ? "allowed\n" : "throttled\n" for 1 .. 5;