[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