[Cascavel-pm] Agendador de tarefas
Luis Campos de Carvalho
monsieur_champs em yahoo.com.br
Terça Junho 14 18:56:36 PDT 2005
--- Igor Sutton Lopes <igor em izut.com> escreveu:
> Boa noite todos,
>
> Tenho a necessidade um módulo agendador de "subs" (como o Schedule::Cron,
> porém que seja nos moldes do at), com independência de plataforma. Como
> somente achei o Schedule::At, resolvi criar um (nome provisório
> Schedule::SubScheduler). Estou no início do desenvolvimento, porém percebi
> que o laço que estou utilizando - undef while 1 - está utilizando muita CPU
> (mais de 80%). Estou utilizando $SIG{ALRM} para verificar e executar a funcao
> agendada.
>
> Vocês tem alguma idéia para minimizar a utilização de CPU deste laço?
Use sleep() em lugar de while(1).
Isso ajuda muito.
Mas você precisa lembrar de calcular a próxima hora de acordar antes de dormir, com alguma coisa
assim:
sub calc_wake_up_time{
my $jobs_table = shift; # hash de timestamps com arrayrefs de "tarefas" agendadas
my $next_wakeup = ( grep sort \&by_time keys %$jobs_table )[0];
# calcula aproximadamente quantos segundos até o próximo wakeup e dorme
sleep( $next_wakeup - time() );
}
E você pode fazer algo assim no seu main loop:
my $jobs_table = read_jobs( '/path/to/jobs.table' );
while( 1 ){ # main loop
# alguma tarefa nova?
check_for_new_jobs( $jobs_table );
# roda as tarefas desta iteração
run_jobs( $jobs_table );
# calcula o momento da próxima iteração
calc_wake_up_time( $jobs_table );
}
Ou você pode fixar o tempo (eu acho mais interessante) entre duas iterações, assim:
while( 1 ){
check_for_new_jobs( $jobs_table );
run_jobs( $jobs_table );
sleep( 60 ); # intervalo fixo de aproximadamente 1 min entre wake-ups e jobs
}
Desta forma, seu sistema nunca vai ter problemas.
Putamplexos, e espero que isso ajude.
--
Luis Campos de Carvalho
Member of "São Paulo Perl Mongers",
Unix SysAdmin & OCP/DBA Oracle
http://br.geocities.com/monsieur_champs/
____________________________________________________
Yahoo! Mail, cada vez melhor: agora com 1GB de espaço grátis! http://mail.yahoo.com.br
Mais detalhes sobre a lista de discussão Cascavel-pm