[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