use Time::HiRes qw( time sleep ); use constant { TIMES_PER_PERIOD => 3, # Integer PERIOD => 1.0, # Fractional seconds }; my @times = (0) x TIMES_PER_PERIOD; while (my $r = get_request()) { my $wait = ($times[0] + PERIOD) - time(); if ($wait > 0) { sleep($wait); redo; # In case sleep got interrupted. } do_request($r); shift(@times); push(@times, time()); }