[Cascavel-pm] Perl X RAM (memória)

Blabos de Blebe blabos em gmail.com
Quinta Janeiro 20 06:26:34 PST 2011


Para Executar somente um comando de cada vez eu tenho usado o IPC::Run.
http://search.cpan.org/~toddr/IPC-Run-0.89/lib/IPC/Run.pm

Já para executar vários processos paralelo, eu costumo usar
Parallel::ForkManager
http://search.cpan.org/~dlux/Parallel-ForkManager-0.7.5/ForkManager.pm

É só ficar atento que a cada novo script, um novo interpretador é instanciado.

2011/1/20 Andre Carneiro <andregarciacarneiro em gmail.com>:
> O sr. Stanislav foi quem me encorajou a começar a mexer com esse troço, e na
> verdade parece ser muito bom.
> Qualquer dúvida, ou se eu escrevi alguma besteira(não testei o código) fala
> com o Stan que teve mais contato que eu com esse módulo.
>
> Cheers!
>
> Em 20 de janeiro de 2011 08:48, Andre Carneiro
> <andregarciacarneiro em gmail.com> escreveu:
>>
>> Tem o AnyEvent também. Bem simples, e gerencia os forks bem melhor que
>> 'meros seres humanos', embora pareça para mim bem menos complicado que o
>> POE.
>> Encontrei algo que parece se adequar ao que você precisa na documentação:
>> <code>
>> use strict;
>> use warnings;
>> use AnyEvent;
>> my $done = AnyEvent->condvar; #condvar é um Watcher. Pra saber o que é
>> isso, leia a doc. do módulo. Esse cara vai receber a condição que pode
>> determinar, por exemplo, o fim da execução.
>>
>>    my $pid = fork or exit 5; #gerando o processo ou saindo se não
>> conseguir
>>   my @scripts_to_run = somefunction_that_catch_the_scripts;
>> foreach my $sc(@scripts_to_run){
>>    my $w = AnyEvent->child (   #Esse watcher é específico para cuidar dos
>> processos filhos gerados pelo fork
>>       pid => $pid,
>>       cb  => sub { #essa é a função de callback... Você pode implementa-la
>> em outro lugar...
>>          my ($pid, $status) = @_;
>>          warn "pid $pid exited with status $status"; #imprime o pid do
>> processo e o status.
>>          #...vc pode rodar o seus script aqui com system, onde $sc tem o
>> nome do script corrente, mas se valer a pena, talvez seja uma boa idéia que
>> você coloque esses caras num módulo, e os execute como funções desse módulo
>> aqui.
>>          $done->send;
>>       },
>>    );
>>
>>    # a grosso modo, espera o programa terminar...
>>    $done->recv;
>> }
>> </code>
>>
>>
>>
>>
>>
>> Cheers!
>>
>> Em 20 de janeiro de 2011 07:46, João André Simioni <jasimioni em gmail.com>
>> escreveu:
>>>
>>> Blabos,
>>>
>>> Ele está chamando o script.pl com & comercial no final - assim a Shell
>>> imediatamente coloca o processo em background e o system retorna
>>> imediatamente. Ele consegue os múltiplos processos paralelos.
>>>
>>> Mas para o sistema operacional, é como se tivesse executado cada um
>>> deles separadamente e por isso a quantidade de memória excessiva (não
>>> compartilham nenhuma matriz de dados, nem nada assim).
>>>
>>> []'s
>>>
>>> Joao Andre
>>>
>>>
>>>
>>> 2011/1/20 Blabos de Blebe <blabos em gmail.com>:
>>> > Puta merda!
>>> >
>>> > Não é que se a gente não tomar cuidado bizonhice pega!
>>> >
>>> > Aff...
>>> >
>>> > 2011/1/20 Alexei Znamensky <russoz em gmail.com>:
>>> >> Blabos
>>> >>
>>> >> 2011/1/20 Blabos de Blebe <blabos em gmail.com>
>>> >>>
>>> >>> Não foi o que você perguntou, mas considere:
>>> >>>
>>> >>> foo.pl:
>>> >>> #!/usr/bin/perl
>>> >>>
>>> >>> print $ARGV[0], $/;
>>> >>> `sleep 5`;
>>> >>
>>> >> aspas invertidas?? WTF?
>>> >> perldoc -f sleep
>>> >>
>>> >>>
>>> >>> ___
>>> >>>
>>> >>> perl -E 'while($i++ < 10){system("./foo.pl", $i)}'
>>> >>>
>>> >>> perldoc -f system:
>>> >>> Does exactly the same thing as exec LIST , except that a fork is done
>>> >>> first, and the parent process waits for the child process to exit.
>>> >>>
>>> >>>
>>> >>> Então não tem chamada parelela nenhuma acontecendo.
>>> >>>
>>> >>> Abraços
>>> >>>
>>> >>> 2011/1/20 Lindolfo Lorn Rodrigues <lorn.br em gmail.com>:
>>> >>> > Cara, usar system não é uma boa pratica para cada chamada no system
>>> >>> > ele
>>> >>> > vai
>>> >>> > carregar um bash para tratar o STDOUT que você manda para o
>>> >>> > /dev/null,
>>> >>> > eu
>>> >>> > recomendo você dar uma olhada no POE, ele é um sistema de 'threads'
>>> >>> > e
>>> >>> > você
>>> >>> > pode construir seu system dentro dele, e ele seria o seu "script
>>> >>> > chefe"
>>> >>> > porque ele foi feito para isso.
>>> >>> > E ele tem um cookbook http://poe.perl.org/?POE_Cookbook quando eu
>>> >>> > usei
>>> >>> > ele,
>>> >>> > eu peguei um cookbook ( receita de bolo ) que mais se parecia com o
>>> >>> > meu
>>> >>> > problema e mudei um pouco com o meu programa e etc. No seu caso
>>> >>> > parece
>>> >>> > que
>>> >>> > você que gerenciar
>>> >>> > processos http://poe.perl.org/?POE_Cookbook/Child_Component.
>>> >>> > Minha principal dica é, não use system faça seus programas Perl
>>> >>> > conversarem
>>> >>> > com eles mesmo usando IPC, TCP sei lá, o POE resolve tudo isso para
>>> >>> > você
>>> >>> > caso tenha alguma duvida pergunte ai, flw.
>>> >>> > 2011/1/20 Tom Mostard <capmostarda em gmail.com>
>>> >>> >>
>>> >>> >> Olá, pessoal!
>>> >>> >>
>>> >>> >> Estou tendo um problema de memória com scripts em Perl.
>>> >>> >> Alguém aí teve algum problema parecido?
>>> >>> >>
>>> >>> >> Tenho um "pequeno" sistema que precisa executar vários scripts
>>> >>> >> Perl em
>>> >>> >> paralelo.
>>> >>> >> Então existe um script Perl "chefe" que fica responsável por
>>> >>> >> executar
>>> >>> >> eles
>>> >>> >> com parâmetros diferentes usando system().
>>> >>> >>
>>> >>> >> O sistema acessa vários bancos de dados e a depender do banco, da
>>> >>> >> tabela e
>>> >>> >> do campo ele executa um módulo específico.
>>> >>> >> Uso o MySQL em outra máquina para não abusar da memória.
>>> >>> >>
>>> >>> >> Script-chefe:
>>> >>> >>
>>> >>> >> while ( my $i < $execucoes ) # são execuções limitadas, mas por
>>> >>> >> enquanto
>>> >>> >> são 60
>>> >>> >> {
>>> >>> >>     system( './script.pl $parametro1 > /dev/null & ' );
>>> >>> >> }
>>> >>> >>
>>> >>> >> Dentro do script é carregado um módulo usando require assim:
>>> >>> >>
>>> >>> >> require $ARGV[ 0 ].".pm";
>>> >>> >>
>>> >>> >> Funciona tudo certo, se rodo 20, funciona tudo normal e eles
>>> >>> >> ocupam 158
>>> >>> >> MB
>>> >>> >> de memória.
>>> >>> >> Se rodo 40, eles ocupam 316 MB de memória além da memória usada
>>> >>> >> pelo
>>> >>> >> sistema.
>>> >>> >> Me parece que cada script carregado usa 8 MB em média. (Isso é
>>> >>> >> possível/normal?)
>>> >>> >> Quando uso 60, nem todos os scripts são executados.
>>> >>> >> Existe alguma maneira de executar um script otimizando o uso de
>>> >>> >> memória
>>> >>> >> ou
>>> >>> >> vou ter que reavaliar o código?
>>> >>> >> Já revisei o código e eliminei arrays, variáveis de conexões com
>>> >>> >> bancos
>>> >>> >> desnecessárias.
>>> >>> >> Existe algo mais que eu possa fazer?
>>> >>> >>
>>> >>> >> Abraços,
>>> >>> >>
>>> >>> >> Tom
>>> >>> >>
>>> >>> >> _______________________________________________
>>> >>> >> Cascavel-pm mailing list
>>> >>> >> Cascavel-pm em pm.org
>>> >>> >> http://mail.pm.org/mailman/listinfo/cascavel-pm
>>> >>> >
>>> >>> >
>>> >>> >
>>> >>> > --
>>> >>> > lorn at lornlab dot org
>>> >>> > Lindolfo "Lorn" Rodrigues
>>> >>> >
>>> >>> >
>>> >>> > _______________________________________________
>>> >>> > Cascavel-pm mailing list
>>> >>> > Cascavel-pm em pm.org
>>> >>> > http://mail.pm.org/mailman/listinfo/cascavel-pm
>>> >>> >
>>> >>> _______________________________________________
>>> >>> Cascavel-pm mailing list
>>> >>> Cascavel-pm em pm.org
>>> >>> http://mail.pm.org/mailman/listinfo/cascavel-pm
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Alexei Znamensky [russoz_gmail_com] [russoz.wordpress.com]
>>> >> [www.flickr.com/photos/alexeiz]
>>> >> «Only love / Can bring the rain / That makes you yearn to the sky»
>>> >>
>>> >> _______________________________________________
>>> >> Cascavel-pm mailing list
>>> >> Cascavel-pm em pm.org
>>> >> http://mail.pm.org/mailman/listinfo/cascavel-pm
>>> >>
>>> > _______________________________________________
>>> > Cascavel-pm mailing list
>>> > Cascavel-pm em pm.org
>>> > http://mail.pm.org/mailman/listinfo/cascavel-pm
>>> >
>>> _______________________________________________
>>> Cascavel-pm mailing list
>>> Cascavel-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/cascavel-pm
>>
>>
>>
>> --
>> André Garcia Carneiro
>> Analista/Desenvolvedor Perl
>> (11)82907780
>
>
>
> --
> André Garcia Carneiro
> Analista/Desenvolvedor Perl
> (11)82907780
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>


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