My buckets are leaky! If you ever have to do anything like rate limiting or throttling you should look at the token bucket algorithm. Handily CPAN has Algorithm::TokenBucket (which is similar) to make it easy for you. I recently wanted to throttle Net::SFTP::Foreign and ended up with something like this:
use Algorithm::TokenBucket; use Net::SFTP::Foreign::Compat; use Time::HiRes qw(sleep); my $mbps = 0.5; my $bps = $mbps * 1024 * 1024 / 8; my $bucket = Algorithm::TokenBucket->new( $bps, 32768 ); ... my $last_offset = 0; $sftp->get( $remote_filename, $filename, sub { my ( $sftp, $data, $offset, $size ) = @_; my $bytes = $offset - $last_offset; $last_offset = $offset; sleep 0.01 until $bucket->conform($bytes); $bucket->count($bytes); } );