Perl capped exponential backoff with jitter
Perl
use strict;
use warnings;
use Time::HiRes qw(sleep);
sub retry {
my ($attempts, $code, %opt) = @_;
my ($base, $cap) = ($opt{base} // 0.1, $opt{cap} // 5);
for my $try (1 .. $attempts) {
my @out = eval { $code->($try) };
return wantarray ? @out : $out[0] if !$@;
die $@ if $try == $attempts;
my $delay = $base * 2 ** ($try - 1);
$delay = $cap if $delay > $cap;
sleep($delay * (0.5 + rand(0.5)));
}
}
my $n = retry(4, sub { die "flaky\n" if rand() < 0.7; return "ok" });
print "$n\n";