[Cascavel-pm] Controle de processo em perl

Igor Sutton Lopes igor.sutton em gmail.com
Quinta Abril 5 12:27:39 PDT 2007


Olá Kleber,

On 2007/04/05, at 18:11, KLEBER wrote:

> Tomo a liberdade de enviar-lhe(s) este email cujo o assunto é PERL  
> pois
> talvez você ou alguém que conheça  possa me ajudar.
> Estou escrevendo uma aplicação em perl  e preciso garantir que um
> determinado processo seja executado de forma única ( sem  
> concorrência ).
>
> Pôr exemplo , uma função que atualiza uma tabela de agencia , ao ser
> executada  , todas as outras funções que acessam esta tabela deve  
> esperar
> sua conclussão ( portanto deve-se formar uma fila de pedidos para
> atendimento ).
>
> Atualmente estou fazendo isto da seguinte maneira :
> #
> #      Permite executar um script por vez
> #
> denovo:
> if ( -e "c:\\payback\\contabil\\tabelas\\agencia\\cgiaform.nul" )  
> { goto
> denovo; }
> sysopen( TASK15,
> "c:\\payback\\contabil\\tabelas\\agencia\\cgiaform.nul",
> O_WRONLY|O_EXCL|O_CREAT  ) or warn ( goto denovo );
> flock( TASK15, LOCK_EX ) or warn ( goto denovo );
> ---------------------------------
> Instruções diversas em perl  5.8
> --------------------------------
> flock( TASK15, LOCK_UN );
> close( TASK15 );
> unlink( "c:\\payback\\contabil\\tabelas\\agencia\\cgiaform.nul" );
> exit;
>

Uma maneira primitiva de fazer a mesma coisa, utilizando arquivos  
como lock.

<code>
use File::Slurp;

PROCESS:
{
     if ( -e $LOCK_FILE ) {

         sleep 1;
         redo PROCESS;
     }

     write_file($LOCK_FILE, $$);

     do_whatever_you_want();

     unlink $LOCK_FILE;
}
</code>

Agora com flock:

<code>
# importa constantes para flock e seek
use Fcntl qw(:flock :seek);

# abre arquivo.
open my $fh, "<", $filename or die $!;

# aciona lock no filehandle. vai esperar aqui até outra instância do  
programa liberar o arquivo.
flock($fh, LOCK_EX);

# move cursor para o final do arquivo
seek($fh, 0, SEEK_END);

# imprime algo
print $fh "Some text!\n";

# desbloqueia o filehandle
flock($fh, LOCK_UN);

# fecha o arquivo
close $fh or warn $!;
</code>

Lembre-se que flock() atua em filehandles. Lembre-se também que flock 
() funciona apenas com outros programas que utilizam flock(), isto é,  
se um outro programa for interagir com este arquivo e não utilizar  
flock(), provavelmente irá ocasionar problemas.

Alguns outros pontos a considerar:

- Labels são, no senso comum, nomeados com letras MAIUSCULAS pois  
ajudam a distinguir de funções;
- Utilize File::Spec para tratar com caminhos de arquivos;
- Apesar de utilizarmos labels, 'goto's são feios :-P Utilize escopos  
para isso, como no exemplo que transcrevi;
- Não é necessário utilizar as rotinas sys* a menos que você saiba o  
que está fazendo :-);
- Utilize scalars para armazenar a referência de arquivos abertos com  
open, ao invés de barewords.

Acho que é só, e espero que ajude.
--
Igor Sutton
igor.sutton em gmail.com



-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070405/025b3d68/attachment.html 
-------------- Próxima Parte ----------
Um anexo não texto foi limpo...
Nome  : PGP.sig
Tipo  : application/pgp-signature
Tam   : 186 bytes
Descr.: This is a digitally signed message part
Url   : http://mail.pm.org/pipermail/cascavel-pm/attachments/20070405/025b3d68/attachment.bin 


Mais detalhes sobre a lista de discussão Cascavel-pm