use Proc::Governor();
my $gov = Proc::Governor->new();
while( ... ) {
$gov->breathe();
... # Use resources
}
while( ... ) {
my $res = $gov->work( sub {
... # Use Service
} );
...
}
####
my $gov = Proc::Governor->new( {
working => 0,
minSeconds => 0.01,
maxPercent => 100,
unsafe => 0,
} );
####
H Q Total
50% 0% 50%
40% 10% 50%
30% 20% 50%
25% 25% 50%
####
$gov->beginWork( $breathe );
####
$gov->endWork( $breathe );
####
$gov->work( sub {
... # Consume resources
}, $which );
####
$gov->beginWork( $before );
... # Consume resources
$gov->endWork( $after );
####
0 No pause will happen.
1 A pause may happen before the sub reference is called.
2 A pause may happen after the sub reference is called.
3 A pause may happen before and/or after the sub is called.
####
my @a = $gov->work( sub { ...; get_list() }, $which );
my $s = $gov->work( sub { ...; get_item() }, $which );
####
$gov->breathe( $begin );
####
$gov->breathe();
# or
$gov->breathe( 1 );
####
$gov->beginWork( 1 );
####
$gov->breathe( 0 );
####
$gov->pulse( $count, $begin );
####
my $gov = Proc::Governor->new( {
maxPercent => 70,
working => 1,
} );
my $redis = Redis->new(server=>...);
while( ... ) {
$gov->pulse( 20 );
$redis->...;
}
####
...
my $count = 0;
while( ... ) {
if( 20 < ++$count ) {
$gov->breathe();
$count = 0;
}
...
####
my $g_cpu = Proc::Governor->new( { maxPercent => 80 } );
my $g_db = Proc::Governor->new( { maxPercent => 30 } );
$g_db->beginWork();
my $db = DBI->connect( ... ); # DB work
my $rows = $db->selectall_arrayref( ... );
$g_db->endWork();
for my $row ( @$rows ) {
my $upd = $g_cpu->work( sub {
process_row( $row ); # Local work
} );
$g_db->work( sub {
$db->update_row( $upd ); # DB work
} );
}
####
sub handle_request {
my( $req ) = @_;
our $Gov ||= Proc::Governor->new();
my $res = $Gov->work( sub {
forward_request( $req );
}, 0 ); # Don't pause here.
give_response( $res );
$Gov->breathe( 0 ); # Pause here; still idle.
}