[SP-pm] RES: SaoPaulo-pm Digest, Vol 53, Issue 5

Blabos de Blebe blabos at gmail.com
Fri Feb 13 10:33:13 PST 2009


já tentou o Parallel::ForkManager ?

2009/2/13 Guilherme Luis Eberhardt <guilherme.eberhardt em gmail.com>:
> Pessoal,
>
> Esses tempos eu escrevi nesta lista referente ao meu servidor socket
> utilizando thread que não "liberava" toda a memória que utilizou.
> Comecei a utilizar fork() como vocês recomendaram e ele ocupa muita memória
> para os outros processos. Isto quando o processo não se perde e eu tenho que
> dar um "kill" em todo o servidor. Sem contar que as vezes o serviço cai.
>
> Utilizei o módulo Net::Server e as vezes o serviço também.
>
> A melhor solução ainda continua sendo com threads. Mas o consumo de memória
> ainda está aumentando.
>
> Alguém tem mais alguma sugestão?
>
> Segue meu e-mail original:
>
> ------------------------------------
>
> Estou desenvolvendo um servidor e cliente em Perl para comunicação via
> socket.
> Para agilizar o processo estou utilizando thread no servidor.
>
> Meu sistema operacional é: HP-UX B.11.23 U ia64
> Perl: 5.8.9
>
> Meu problema é que para cada requisição que faço do cliente para o servidor,
> a quantidade de uso de páginas aumenta mesmo quando a thread terminou sua
> execução.
> (Ou seja, o consumo de memória do servidor aumenta)
> Não sei se está ficando algum lixo de memória.
> O estranho é que o mesmo código sem thread o consumo de memória do servidor
> fica sempre igual.
>
> O comando que estou utilizando para monitorar o consumo de memória é:
> kmeminfo -u
>
> Antes eu utiliza a função de thread "detach" agora estou usando o "join".
>
> Alguém pode me ajudar?
>
> Obrigado.
>
> Segue o código que estou usando para o servidor:
> use threads;
> use IO::Socket;
> use Getopt::Long;
> &GetOptions(   "servidor:s"    => \$pServidor,
> "porta:s"       => \$pPorta,
>                               "comando:s"     => \$pComando,
>                               "log:s"         => \$pLog,
>                               );
> $sock = new IO::Socket::INET ( LocalAddr => "$pServidor",
>                                                               LocalPort =>
> "$pPorta",
>                                                               Proto =>
> 'tcp',
>                                                               Listen => 5,
>                                                               Reuse => 0)
> or die ("problem binding to socket.");
>
> while ($client = $sock->accept()) {
>        $client->autoflush(1);
>        $sockthread = threads->new(\&serviceClient,$client,$cipher);
>        $sockthread->join;
>        undef $client;
>        undef $sockthread;
> }
> ############################################################################
> ####
> sub serviceClient {
>        $cliente = $_[0];
>        $msg = <$cliente>;
>        $msg=~s/\\\{n\}/\n/g;
>        $w1 = `$pComando $msg`;
>        print $client "$w";
>        $client->shutdown(2);
>        undef $_[0];
>        undef $cliente;
>        undef $msg;
>        undef $w1;
>        return;
> }
> ############################################################################
> ####
>
>
> -----Mensagem original-----
> De: saopaulo-pm-bounces+guilherme.eberhardt=gmail.com em pm.org
> [mailto:saopaulo-pm-bounces+guilherme.eberhardt=gmail.com em pm.org] Em nome de
> saopaulo-pm-request em pm.org
> Enviada em: terça-feira, 3 de fevereiro de 2009 22:43
> Para: saopaulo-pm em pm.org
> Assunto: SaoPaulo-pm Digest, Vol 53, Issue 5
>
> Send SaoPaulo-pm mailing list submissions to
>        saopaulo-pm em pm.org
>
> To subscribe or unsubscribe via the World Wide Web, visit
>        http://mail.pm.org/mailman/listinfo/saopaulo-pm
> or, via email, send a message with subject or body 'help' to
>        saopaulo-pm-request em pm.org
>
> You can reach the person managing the list at
>        saopaulo-pm-owner em pm.org
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of SaoPaulo-pm digest..."
>
>
> Today's Topics:
>
>   1. Re: Boas vindas ao Guilherme Luis Eberhardt (Blabos de Blebe)
>   2. Re: SaoPaulo-pm Digest, Vol 53, Issue 4 (Guilherme Eberhardt)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Tue, 3 Feb 2009 22:29:40 -0200
> From: Blabos de Blebe <blabos em gmail.com>
> Subject: Re: [SP-pm] Boas vindas ao Guilherme Luis Eberhardt
> To: saopaulo-pm em mail.pm.org
> Message-ID:
>        <179354400902031629t3dd1a4c9j64e07a094ff944b9 em mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Bem Vindo!!!!!!
>
> On Tue, Feb 3, 2009 at 7:09 PM, Luis Motta Campos
> <luismottacampos em yahoo.co.uk> wrote:
>> mailman-bounces em pm.org wrote:
>>>
>>> Guilherme Luis Eberhardt has been successfully subscribed to
>>> SaoPaulo-pm.
>>
>> Guilherme, seja muito bem vindo e aquela coisa toda. A lista ? sua,
> (ab)use
>> a vontade!
>>
>> A gente gosta de saber dos novatos:
>>
>> 1. como voc? encontrou a lista?
>>
>> e
>>
>> 2. Como e em que voc? usa Perl no seu dia-a-dia?
>>
>> Putamplexos!
>> --
>> Luis Motta Campos is a software engineer,
>> Perl Programmer, foodie and photographer.
>> _______________________________________________
>> SaoPaulo-pm mailing list
>> SaoPaulo-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>
>
> ------------------------------
>
> Message: 2
> Date: Tue, 3 Feb 2009 22:41:24 -0200
> From: Guilherme Eberhardt <guilherme.eberhardt em gmail.com>
> Subject: Re: [SP-pm] SaoPaulo-pm Digest, Vol 53, Issue 4
> To: saopaulo-pm em pm.org
> Message-ID:
>        <2a193ade0902031641g6988b947lf6a8f9c046197464 em mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Luis,
>
> Obrigado pelas boas vindas.
>
> Esse c?digo ? em Perl sim.
> Se eu n?o utilizar thread, fica muito lento.
> Pois para cada requisi??o eu vou ter que esperar liberar a anterior.
> Ou seja, se eu tiver 10 clientes enviando v?rias requisi??es, vou ter uma
> fila.
> E preciso que essas requisi??es sejam processadas simultaneamente
> independente de quantos clientes mandarem ao mesmo tempo.
>
> Nunca utilizei fork.Do que se trata?
>
> Respondendo a sua pergunta, utilizo o Perl diariamente.
> Considero uma "ferramenta" poderosa para ambientes UNIX principalmente.
> Substitui praticamente todos meus scripts shell por perl.
>
> Obrigado.
>
>
> 2009/2/3  <saopaulo-pm-request em pm.org>:
>> Send SaoPaulo-pm mailing list submissions to
>>        saopaulo-pm em pm.org
>>
>> To subscribe or unsubscribe via the World Wide Web, visit
>>        http://mail.pm.org/mailman/listinfo/saopaulo-pm
>> or, via email, send a message with subject or body 'help' to
>>        saopaulo-pm-request em pm.org
>>
>> You can reach the person managing the list at
>>        saopaulo-pm-owner em pm.org
>>
>> When replying, please edit your Subject line so it is more specific
>> than "Re: Contents of SaoPaulo-pm digest..."
>>
>>
>> Today's Topics:
>>
>>   1. Boas vindas ao Guilherme Luis Eberhardt (Luis Motta Campos)
>>   2. Re: Threads em Perl (Luis Motta Campos)
>>   3. Re: Catalyst: Come?ando... (Nelson Ferraz)
>>   4. Re: Threads em Perl (Blabos de Blebe)
>>
>>
>> ----------------------------------------------------------------------
>>
>> Message: 1
>> Date: Tue, 03 Feb 2009 22:09:47 +0100
>> From: Luis Motta Campos <luismottacampos em yahoo.co.uk>
>> Subject: [SP-pm] Boas vindas ao Guilherme Luis Eberhardt
>> To: saopaulo-pm em mail.pm.org
>> Message-ID: <4988B29B.7030802 em yahoo.co.uk>
>> Content-Type: text/plain; charset=ISO-8859-1; format=flowed
>>
>> mailman-bounces em pm.org wrote:
>>> Guilherme Luis Eberhardt has been successfully subscribed to
>>> SaoPaulo-pm.
>>
>> Guilherme, seja muito bem vindo e aquela coisa toda. A lista ? sua,
>> (ab)use a vontade!
>>
>> A gente gosta de saber dos novatos:
>>
>> 1. como voc? encontrou a lista?
>>
>> e
>>
>> 2. Como e em que voc? usa Perl no seu dia-a-dia?
>>
>> Putamplexos!
>> --
>> Luis Motta Campos is a software engineer,
>> Perl Programmer, foodie and photographer.
>>
>>
>> ------------------------------
>>
>> Message: 2
>> Date: Tue, 03 Feb 2009 22:14:03 +0100
>> From: Luis Motta Campos <luismottacampos em yahoo.co.uk>
>> Subject: Re: [SP-pm] Threads em Perl
>> To: saopaulo-pm em mail.pm.org
>> Message-ID: <4988B39B.4030906 em yahoo.co.uk>
>> Content-Type: text/plain; charset=windows-1252; format=flowed
>>
>> Guilherme Luis Eberhardt wrote:
>>> Pessoal, boa tarde!
>>>
>>> Estou desenvolvendo um servidor e cliente em Perl para comunica??o
>>> via socket.
>>>
>>> Para agilizar o processo estou utilizando thread no servidor.
>>>
>>> Meu sistema operacional ?: HP-UX B.11.23 U ia64
>>>
>>> Perl: 5.8.9
>>>
>>> Meu problema ? que para cada requisi??o que fa?o do cliente para o
>>> servidor, a quantidade de uso de p?ginas aumenta mesmo quando a
>>> thread terminou sua execu??o.
>>>
>>> (Ou seja, o consumo de mem?ria do servidor aumenta)
>>>
>>> N?o sei se est? ficando algum lixo de mem?ria.
>>>
>>> O estranho ? que o mesmo c?digo sem thread o consumo de mem?ria do
>>> servidor fica sempre igual.
>>>
>>> O comando que estou utilizando para monitorar o consumo de mem?ria ?:
>>>  kmeminfo -u
>>>
>>> Antes eu utiliza a fun??o de thread ?detach? agora estou usando o
>>> ?join?.
>>>
>>> Algu?m pode me ajudar?
>>
>> Em poucas palavras, Guilherme: isso ? Perl, n?o Java. As estrat?gias e
>> as vantagens de Java normalmente aqui s?o mal-vistas por serem
> ineficientes.
>>
>> O meu conselho ? que voc? pare de usar threads (e evite o problema de
>> reclama mem?ria, que, apesar de parecer simples, n?o ? nada trivial de
>> implementar satisfatoriamente em Perl) e passe a usar processos e fork()
>> para implementar um servidor. ? mais de acordo com a filosofia de
>> trabalho do mundo unix, e mais elegante e bem conhecido como solu??o
>> dentro do mundo Perl.
>>
>> Com sorte, voc? vai at? conseguir usar um dos "servidores em lata" que
>> existem no CPAN, e implementar apenas a fun??o que executa o servi?o
>> (deixando o gerenciamento de servidor totalmente ao cargo de uma
>> biblioteca pronta).
>>
>> Algu?m com menos ?lcool no sangue que eu pode por favor apontar os
>> m?dulos no CPAN para o Guilherme?
>>
>> Putamplexos!
>> --
>> Luis Motta Campos is a software engineer,
>> Perl Programmer, foodie and photographer.
>>
>>
>> ------------------------------
>>
>> Message: 3
>> Date: Tue, 3 Feb 2009 22:45:09 +0100
>> From: Nelson Ferraz <nferraz em gmail.com>
>> Subject: Re: [SP-pm] Catalyst: Come?ando...
>> To: saopaulo-pm em mail.pm.org
>> Message-ID:
>>        <604cec170902031345r36610592pab03646ac5bd302e em mail.gmail.com>
>> Content-Type: text/plain; charset=ISO-8859-1
>>
>> Parece muito bom, Thiago! Obrigado pela contribui??o!
>>
>> Por que n?o formata o documento em pod, e copia para o wiki? Aqui vai um
> come?o:
>>
>> =head1 NOME
>>
>> Catalyst - O Elegante framework de programa??o Web em Perl.
>>
>> =head1 DESCRICAO
>>
>> Catalyst ? um framework elegante de programa??o MVC para Web em Perl
>> (ambos gratuitos e de c?digo aberto). Este tutorial
>> simples e talvez muito objetivo tem como miss?o facilitar o
>> entedimento para os novos nesta ferramenta de forma pratica, n?o
>> se prendendo muito a conceitos, motivos e paradigmas.
>>
>> =head1 INICIO
>>
>> =head2 Instala??o do Catalyst.
>>
>> O Perl tem o CPAN, no qual ? um repositorio farto de modulos e
>> documenta??o, voc? pode utilizar o site http://search.cpan.org/ para
>> navegar por ele, e toda distribui??o do Perl vem com um aplicativo
>> chamado "cpan" para voc? poder instalar os modulos atravez da
>> linha de comando.
>>
>>    $ export PERL_MM_USE_DEFAULT=1
>>    $ cpan -i Task::Catalyst
>>
>> O Catalyst tem algumas dependencias, e por isto, al?m do pacote do
>> Catalyst o "cpan" ir? automaticamente instalar as suas dependencias,
>> perceba que estamos utilizando o pacote Task::Catalyst, no qual cont?m
>> uma serie de pacotes recomendadas para a utiliza??o do Catalyst.
>>
>> DICA: Sete a variavel de ambiente PERL_MM_USE_DEFAULT=1 para o cpan
>> n?o lhe questionar sobre as dependencias e demais perguntas, e
>> instalar elas sem lhe perguntar.
>>
>> Pronto, a instala??o esta concluida, agora estamos com o sistema apto
>> para programar utilizando o framework de programa??o Catalyst.
>>
>> =head2 Iniciando o meu primeiro projeto.
>>
>> No pacote do Catalyst, vem acompanhando um aplicativo que facilita a
>> nossa vida para montar o ambiente b?sico para iniciarmos o nosso
>> projeto, chamado de "catalyst.pl", para isto basta executar ele com o
>> primeiro argumento sendo o nome do projeto.
>>
>>    $ catalyst.pl webapp
>>    created "webapp"
>>    created "webapp/script"
>>    created "webapp/lib"
>>    created "webapp/root"
>>    created "webapp/root/static"
>>    created "webapp/root/static/images"
>>    created "webapp/t"
>>    created "webapp/lib/webapp"
>>    created "webapp/lib/webapp/Model"
>>    created "webapp/lib/webapp/View"
>>    created "webapp/lib/webapp/Controller"
>>    created "webapp/webapp.conf"
>>    created "webapp/lib/webapp.pm"
>>    created "webapp/lib/webapp/Controller/Root.pm"
>>    created "webapp/README"
>>    created "webapp/Changes"
>>    created "webapp/t/01app.t"
>>    created "webapp/t/02pod.t"
>>    created "webapp/t/03podcoverage.t"
>>    created "webapp/root/static/images/catalyst_logo.png"
>>    created "webapp/root/static/images/btn_120x50_built.png"
>>    created "webapp/root/static/images/btn_120x50_built_shadow.png"
>>    created "webapp/root/static/images/btn_120x50_powered.png"
>>    created "webapp/root/static/images/btn_120x50_powered_shadow.png"
>>    created "webapp/root/static/images/btn_88x31_built.png"
>>    created "webapp/root/static/images/btn_88x31_built_shadow.png"
>>    created "webapp/root/static/images/btn_88x31_powered.png"
>>    created "webapp/root/static/images/btn_88x31_powered_shadow.png"
>>    created "webapp/root/favicon.ico"
>>    created "webapp/Makefile.PL"
>>    created "webapp/script/webapp_cgi.pl"
>>    created "webapp/script/webapp_fastcgi.pl"
>>    created "webapp/script/webapp_server.pl"
>>    created "webapp/script/webapp_test.pl"
>>    created "webapp/script/webapp_create.pl"
>>
>> Pronto, agora estamos com nosso ambiente b?sico para come?ar a
>> programar, vou explicar de forma r?pida a estrutura
>> de diretorios criada para voc? entender melhor:
>>
>>    $ ls webapp/
>>    Changes  lib/  Makefile.PL  README  root/  script/  t/  webapp.conf
>>
>> Veja, que temos quatro diretorios, que s?o eles:
>>
>> =over
>>
>> =item lib/
>>
>> Cont?m a parte da programa??o l?gica, onde iremos escrever nossos
>> modulos e c?digos em Perl.
>>
>> =item root/
>>
>> Neste diretorio iremos colocar arquivos est?ticos, como templates,
>> javascript e css.
>>
>> =item script/
>>
>> Scripts para inicializar a nossa aplica??o.
>>
>> =item t/
>>
>> Testes para nossa aplica??o.
>>
>> =back
>>
>> Vamos falar um pouco do diretorio "script/", nele voc? tem um script
>> que usaremos muito neste tutorial, webapp_server.pl, no
>> qual ir? iniciar um servidor http na porta 3000 por padr?o, para
>> visualizarmos o nosso aplicativo:
>>
>>    $ script/webapp_server.pl
>>
>> Depois de executar ele, voc? j? pode acessar o aplicativo pelo seu
>> browser favorito, pelo endere?o:
>>
>> L<http://localhost:3000>
>>
>> =head2 Entendendo um MVC (Model-View-Controller)
>>
>> MVC ? um padr?o de arquitetura de software, uma das maiores
>> dificuldades do entendimento de um framework de programa??o
>> web como o Catalyst para os iniciantes ? justamente este conceito.
>>
>> Basicamente o significado deles ?:
>>
>> =over
>>
>> =item Model:
>>
>> S?o as informa??es utilizadas pelo aplicativo, no qual este modelo
>> pode ser um banco de dados, um arquivo texto e etc.
>>
>> =item Controller:
>>
>> L?gica do nosso aplicativo, onde podemos por exemplo alterar as
>> informa??es (Model), filtrar e etc.
>>
>> =item View:
>>
>> Renderizar o Model e o Controller para o usu?rio, ou seja como o
>> aplicativo ser? apresentado.
>>
>> =back
>>
>> Esta ? uma forma r?pida de apresentar os tr?s componentes do MVC,
>> sabendo disto, vamos come?ar a produzir nosso aplicativo.
>>
>> =head2 Nosso projeto: Agenda telefonica
>>
>> Vamos come?ar a estudar o nosso aplicativo, ele ir? gerenciar uma
>> lista de telefones, no qual iremos efetuar um simples "CRUD"
>> (Create-Remove-Update-Destroy), no qual iremos permitir efetuar a
>> cria??o, remover, atualizar e apagar dados de nossa lista.
>>
>> Vamos projetar nossa agenda telefonica, utilizando o MVC da seguinte da
> forma:
>>
>> =over
>>
>> =item Model:
>>
>> Iremos utilizar o MySQL, por?m para efetuar a conectividade com o
>> banco de dados, iremos utilizar um driver do DBI, no
>> qual o MySQL e tantos outros ele suporta, e ? interessante al?m de
>> utilizar o driver de comunica??o com o banco de dados, algum
>> ORM (http://en.wikipedia.org/wiki/Object-relational_mapping) para
>> facilitar a interface com o DB, existem alguns disponiveis como
>> por exemplo o Class::DBI ou DBIx::Class para evitar que voc? escreva
>> SQL no teu c?digo, evitar alguns bugs e trazer agilidade no
>> desenvolvimento, no nosso caso iremos utilizar o DBIx::Class.
>>
>> =item View:
>>
>> Iremos utilizar o HTML como formato de apresenta??o para nossos
>> usuarios, portanto teremos que carregar o modulo que
>> cuidar? de manipular os dados que iremos jogar em nosso arquivo de
>> template, existem alguns modulos disponiveis como o
>> HTML::Manson ou Template::Toolkit), iremos utilizar neste caso o
>> Template::Toolkit.
>>
>> =item Controller:
>>
>> Aqui ? o lugar onde iremos programar, captar os dados no Model e
>> "espirrar" para a View, entre outras.
>>
>> =back
>>
>> =head2 Come?ando pelo Model.
>>
>> Bem, j? dissemos que iremos utilizar o MySQL como banco de dados, e
>> tamb?m j? explicamos por que iremos utilizar o DBIx::Class.
>>
>> Precisamos instalar ele:
>>
>>    $ cpan -i DBIx::Class
>>
>> Certo, agora temos tudo o que precisamos para trabalhar com o nosso
>> Model. Neste tutorial eu vou utilizar o exemplo de criar a
>> tabela direto pelo client do MySQL, e depois ler elas pelo DBIx::Class.
>>
>>    mysql> create database webapp
>>    mysql> grant all on webapp.* to webapp em localhost identified by
> 'webapp';
>>    mysql> flush privileges;
>>    mysql> create table telefones (
>>        id int not null auto_increment,
>>        nome varchar(255),
>>        telefone varchar(255),
>>        primary key(id));
>>
>> Criado a nosso database e nossa tabela, agora vamos para "importar"
>> nosso banco de dados para o DBIx::Class, eu n?o irei me
>> aprofundar no DBIx::Class neste tutorial, pois n?o ? o objetivo dele.
>>
>> Para importarmos este database para os schemas que o DBIx::Class
>> utiliza, iremos executar um dos scripts facilitadores do diretorio
>> scripts/ que se chama "webapp_create.pl" no qual facilita algumas
>> tarefas como esta, a sintaxe utilizada ? auto-explicativa, ?
>> basicamente:
>>
>>    # script/webapp_create.pl model DB DBIC::Schema webapp::Schema
>> create=static dbi:mysql:dbname=webapp webapp webapp
>>    exists "/home/thiago/webapp/script/../lib/webapp/Model"
>>    exists "/home/thiago/webapp/script/../t"
>>    Dumping manual schema for webapp::Schema to directory
>> /home/thiago/webapp/script/../lib ...
>>    Schema dump completed.
>>    created "/home/thiago/webapp/script/../lib/webapp/Model/DB.pm"
>>    created "/home/thiago/webapp/script/../t/model_DB.t"
>>
>> Vejamos os argumentos deste script:
>>
>> =over
>>
>> =item model
>>
>> Estamos criando um model para o script webapp_create.pl
>>
>> =item DB
>>
>> O nome criado para este modem ser? DB (vide lib/webapp/Model/DB.pm)
>>
>> =item DBIC::Schema
>>
>> Nome do helper para criar o Schema para o DBIx::Class
>>
>> =item create=static
>>
>> Significa que o schema ser? estatico, ou seja, a toda altera??o nas
>> tabelas, voc? precisa atualizar nos arquivos criados para o schema.
>>
>> =item dbname
>>
>> Nome do database no MySQL.
>>
>> =item webapp
>>
>> Usuario para se conectar no banco.
>>
>> =item webapp
>>
>> Senha para se conectar no banco.
>>
>> =back
>>
>> Agora, de uma lida nos arquivos criados em lib/webapp/Schema/* e
>> lib/webapp/Model/*
>>
>> Pronto, j? temos o nosso Model pronto para o nosso aplicativo.
>>
>> =head2 View - Template Toolkit.
>>
>> Iremos utilizar neste exemplo a Template::Toolkit, iremos utilizar um
>> helper da mesma maneira que
>> usamos para o banco de dados:
>>
>>    # script/webapp_create.pl view TT TT
>>    exists "/home/thiago/webapp/script/../lib/webapp/View"
>>    exists "/home/thiago/webapp/script/../t"
>>    created "/home/thiago/webapp/script/../lib/webapp/View/TT.pm"
>>    created "/home/thiago/webapp/script/../t/view_TT.t"
>>
>> Pronto, o helper j? criou os arquivos necessarios para utilizarmos a
>> Template Toolkit em nosso projeto.
>>
>> =head2 Controller - Agora sim, programando!
>>
>> Estamos na melhor parte, ? onde tudo acontece, iremos criar 4 actions,
>> para criar, remover, listar e editar.
>>
>> Eu irei colocar o c?digo que utilizei, e com ele comentado explicando
>> passo-a-passo do que estou
>> fazendo nele. N?o irei utilizar nenhum helper ou facilitador nesta
>> parte, pois acredito que a melhor maneira
>> de se desenvolver o Controller ? na 'unha'.
>>
>> Iremos criar um arquivo lib/webapp/Controller/telefone.pm, no qual ele
>> ir? representar na URI "/telefone".
>>
>> Caso queira baixar todos os arquivos, clique aqui.
>>
>>    package webapp::Controller::telefone;
>>
>>    use strict;
>>    use warnings;
>>    use parent 'Catalyst::Controller';
>>
>>    # Nos estamos utilizando um mecanismo muito interessante neste
>>    # exemplo, que recomendo a utilizacao, o Chained.
>>    # N?o iremos entrar discutir sobre ele, porem ele ajuda
>>    # manusearmos os argumentos passados pela URI.
>>    # Por tanto, vamos criar uma rotina "base" no qual todas as
>>    # requisi??es passaram por ela (Chained()).
>>    #
> search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/DispatchType/Chained.pm
>>
>>    sub base :Chained('/') CaptureArgs(0) PathPart('telefone') {
>>        my ($self, $c) = @_;
>>
>>        # stash ? o local onde iremos colocar informa??es para compartilhar
>>        # com outras partes do nosso aplicativo, para cada requisi??o o
> stash
>>        # tem uma vida.
>>        # No caso, abaixo estamos atribuindo ao "collection" no stash o
> nosso
>>        # model "DB::telefones", que corresponde a nossa tabela telefones
> que
>>        # criamos no MySQL.
>>
>>        $c->stash->{collection} = $c->model('DB::telefones');
>>    }
>>
>>
>>    # Veja, aqui estamos criando uma URI list/, no qual ela esta
>> vinculada a nossa
>>    # fun??o base, criada anteriormente (Chained('base')),
>>    #
>>    # Ou seja, para chamar a URL, http://localhost:3000/telefone/list,
>> primeiramente
>>    # ele vai passar na base e depois na list. (* E por ?ltimo, neste
>> nosso exemplo
>>    # na action end do Root.pm, no qual nem iremos comentar neste
> tutorial).
>>    #
>>    # Veja que estamos dizendo Args(0), isto significa que n?o preciso de
> nenhum
>>    # elemento extra na minha URI, sempre que esta action for requisitada,
> ser?
>>    # /telefone/list
>>
>>    sub list :Chained('base') Args(0) {
>>        my ($self, $c) = @_;
>>
>>        # "req" ou "request" s?o as informa??es que est?o no request da
>>        # requisi??o, e no qual temos o metodo param que retorna o valor
>>        # do atributo que gostariamos.
>>        my $key = $c->req->param('key') || "";
>>
>>        # Aham, aqui estamos utilizando o DBIx:Class, repare que n?o iremos
>>        # escrever nenhum um c?digo de SQL aqui, veja abaixo que iremos
>>        # utilizar uma fun??o search_like(), no qual iremos procurar pelo
>>        # elemento $key nos dois campos (nome, telefone), estou usando o
>>        # $key, caso o usuario queira procurar por alguma palavra chave.
>>        my $items = $c->stash->{collection}->search_like({
>>        nome => "\%$key\%",
>>        telefone => "\%$key\%"
>>        });
>>
>>        # Aqui estou colocando no stash o key, para mostrar na View por
> qual
>>        # palavra o usuario esta procurando, e o items encontrados.
>>        $c->stash->{key} = $key;
>>        $c->stash->{items} = $items;
>>    }
>>
>>    # Esta fun??o ? para remover uma determinada coluna do nosso banco de
> dados,
>>    # repare que aqui estamos utilizando Args(1), ou seja estou esperando
> um
>>    # elemento na minha URI, al?m de /telefones/destroy, eu s? irei acessar
> esta
>>    # URI, se acessar por /telefones/destroy/N, onde N ? o ID do nosso
> item.
>>    # Veja que no c?digo da fun??o, estaremos novamente usando uma
>> fun??o do DBIx:Class,
>>    # primeiramente irei procurar por este elemento com find() e ent?o
>> irei remover
>>    # ele.
>>
>>    sub destroy :Chained('base') :Args(1) {
>>        my ($self, $c, $id) = @_;
>>        my $row = $c->stash->{collection}->find({ id => $id });
>>        $row->delete if $row;
>>    }
>>
>>    # Aqui, iremos editar o nosso item, onde tamb?m esperamos um
>> argumento, que ? o id
>>    # do item, e iremos procurar ele.
>>    # Repare que aqui, eu fa?o uma verifica??o, onde quero saber se o
>> metodo utilizado
>>    # para chamar esta requisi??o ? POST, caso n?o seja eu vou
>> "encarrar" (detach())
>>    # esta fun??o e vou passar para a pr?xima fun??o da cadeia. (end()
>> no Root.pm, neste
>>    # caso).
>>    # Resumindo, se o usu?rio n?o apertou "ALTERAR" no html (no qual o
>> form esta enviando
>>    # os dados via POST), eu irei mostrar a p?gina com os dados do
>> objeto N ($id).
>>
>>    sub edit :Chained('base') :Args(1) {
>>        my ($self, $c, $id) = @_;
>>
>>        my $row = $c->stash->{row} = $c->stash->{collection}->find({id =>
> $id});
>>        $c->stash->{template} = "telefone/create.tt";
>>
>>        $c->detach() unless $c->req->method eq 'POST';
>>
>>        # Caso o usuario, tenha apertado o submit do nosso form, para
>> alterar os dados,
>>        # eu vou colocar eles em $parameters = {}, e vou mandar o $row
>> (que ? o objeto
>>        # do find()) para o metodo update().
>>
>>        my $parameters;
>>        $parameters->{nome} = $c->req->param('nome');
>>        $parameters->{telefone} = $c->req->param('telefone');
>>
>>        $row->update($parameters);
>>
>>        # Agora, nao vou mandar ele para a mesma tela, vou enviar para
>> uma template diferente.
>>        $c->stash->{template} = "telefone/edit_ok.tt";
>>    }
>>
>>    # Esta rotina ? bem parecida com a do edit, com a unica diferen?a,
>> que ao invez de atualizar
>>    # eu vou inserir.
>>
>>    sub create :Chained('base') :Args(0) {
>>        my ($self, $c) = @_;
>>        $c->detach() unless $c->req->method eq 'POST';
>>
>>        my $parameters;
>>        $parameters->{nome} = $c->req->param('nome');
>>        $parameters->{telefone} = $c->req->param('telefone');
>>
>>        my $row = $c->stash->{collection}->new($parameters);
>>        $row->insert;
>>
>>        $c->stash->{template} = "telefone/create_ok.tt";
>>    }
>>
>>    # Caso, eu n?o especifique nada na URI de telefones, ou seja, acessar
>>    # http://localhost:3000/telefone eu irei redirecionar para a action
> list,
>>    # que j? comentamos sobre ela.
>>    sub index :Path :Args(0) {
>>        my ($self, $c) = @_;
>>
>>        $c->res->redirect(
>>        $c->uri_for(
>>        $c->controller->action_for('list')
>>        )
>>        );
>>    }
>>
>>    1;
>>
>>
>> C?digo pronto, porem precisamos das templates.
>>
>> Agora, crie estes arquivos no diretorio root/telefone:
>>
>> Este arquivo, ? para a action "create", no qual ? o nosso formulario
>> para criar um item na nossa agenda.
>>
>> =head3 create.tt
>>
>>    <h1>Criar</h1>
>>
>>    <form method="POST">
>>
>>    <table><tr><td>
>>    Nome:
>>    </td><td> <input type="text" name="nome" value="[% row.nome %]"
> size=20>
>>    </td></tr><tr><td>
>>    Telefone:
>>    </td><td> <input type="text" name="telefone" value="[%
>> row.telefone %]" size=20>
>>    </td></tr><tr><td colspan="2">
>>    <center><input type="submit"></center>
>>    </td></tr></table>
>>
>>    </form>
>>
>> Este arquivo ? a mensagem depois da cria??o do item.
>>
>> =head3 create_ok.tt
>>
>>    <h1>Telefone inserido com sucesso!</h1>
>>
>> Mensagem para o item apagado.
>> =head3 destroy.tt
>>
>>    <h1>Telefone apagado</h1>
>>
>> Mensagem para item editado.
>>
>> =head3 edit_ok.tt
>>
>> <h1>Editado com sucesso.</h1>
>>
>> Listar itens da nossa agenda, e tamb?m dar ao usu?rio a op??o de procurar
> neles.
>>
>> =head3 list.tt
>>
>>    <h1>Listar</h1>
>>
>>    <form>
>>    Procurar por:
>>    <input type="text" name="key" size="15">
>>    <input type="submit" value=" Procurar " >
>>    </form>
>>
>>    [% IF key %]
>>    <br/>
>>    <b>Procurando por [% key %]</b>
>>    <br/>
>>    [% END %]
>>
>>    <table><tr><td>
>>    <b>Nome</b>
>>    </td><td>
>>    <b>Telefone</td>
>>    </td><td>
>>    <b>A&ccedil;&atilde;o
>>    </td></tr>
>>
>>    [% WHILE (item = items.next) %]
>>        <tr><td>
>>        [% item.nome %]
>>        </td><td>
>>        [% item.telefone %]
>>        </td><td>
>>        <a href="[% c.uri_for('edit', item.id) %]">Editar</a>
>>        -
>>        <a href="[% c.uri_for('destroy', item.id) %]">Remover</a>
>>        </td></tr>
>>    [% END %]
>>
>>    </table>
>>
>> =head1 AUTOR
>>
>> Thiago Rondon <thiago em aware.com.br>
>>
>> =head1 COLABORADORES
>>
>>
>> ------------------------------
>>
>> Message: 4
>> Date: Tue, 3 Feb 2009 22:29:14 -0200
>> From: Blabos de Blebe <blabos em gmail.com>
>> Subject: Re: [SP-pm] Threads em Perl
>> To: saopaulo-pm em mail.pm.org
>> Message-ID:
>>        <179354400902031629o283468d7g15ba6a677ce2e916 em mail.gmail.com>
>> Content-Type: text/plain; charset=ISO-8859-1
>>
>> Minha ?ltima experi?ncia com fork em Perl foi utilizando o
>> Parallel::ForkManager, bastante simples de usar. S? n?o sei se atende
>> ao que vc precisa.
>>
>> <pseudo_code>
>> $pfm = Parallel::ForkManager->new($max_process);
>> die 'blablabla' unless $pfm;
>>
>> foreach (@array_of_several_data) {
>>    $pfm->start() and next;
>>
>>    &process_one_data($my_current_data);
>>
>>    $pfm->finish();
>> }
>> $pfm->wait_all_children();
>> <pseudo_code>
>>
>> Uma outra sugest?o ? procurar o fernandocorrea at gmail dot com que
>> ele est? escrevendo um m?dulo de emula??o de threads muito
>> interessante.
>>
>> Abra?os
>>
>>
>> 2009/2/3 Luis Motta Campos <luismottacampos em yahoo.co.uk>:
>>> Guilherme Luis Eberhardt wrote:
>>>>
>>>> Pessoal, boa tarde!
>>>>
>>>> Estou desenvolvendo um servidor e cliente em Perl para comunica??o
>>>> via socket.
>>>>
>>>> Para agilizar o processo estou utilizando thread no servidor.
>>>>
>>>> Meu sistema operacional ?: HP-UX B.11.23 U ia64
>>>>
>>>> Perl: 5.8.9
>>>>
>>>> Meu problema ? que para cada requisi??o que fa?o do cliente para o
>>>> servidor, a quantidade de uso de p?ginas aumenta mesmo quando a
>>>> thread terminou sua execu??o.
>>>>
>>>> (Ou seja, o consumo de mem?ria do servidor aumenta)
>>>>
>>>> N?o sei se est? ficando algum lixo de mem?ria.
>>>>
>>>> O estranho ? que o mesmo c?digo sem thread o consumo de mem?ria do
>>>> servidor fica sempre igual.
>>>>
>>>> O comando que estou utilizando para monitorar o consumo de mem?ria ?:
>>>>  kmeminfo -u
>>>>
>>>> Antes eu utiliza a fun??o de thread "detach" agora estou usando o
>>>> "join".
>>>>
>>>> Algu?m pode me ajudar?
>>>
>>> Em poucas palavras, Guilherme: isso ? Perl, n?o Java. As estrat?gias e as
>>> vantagens de Java normalmente aqui s?o mal-vistas por serem ineficientes.
>>>
>>> O meu conselho ? que voc? pare de usar threads (e evite o problema de
>>> reclama mem?ria, que, apesar de parecer simples, n?o ? nada trivial de
>>> implementar satisfatoriamente em Perl) e passe a usar processos e fork()
>>> para implementar um servidor. ? mais de acordo com a filosofia de
> trabalho
>>> do mundo unix, e mais elegante e bem conhecido como solu??o dentro do
> mundo
>>> Perl.
>>>
>>> Com sorte, voc? vai at? conseguir usar um dos "servidores em lata" que
>>> existem no CPAN, e implementar apenas a fun??o que executa o servi?o
>>> (deixando o gerenciamento de servidor totalmente ao cargo de uma
> biblioteca
>>> pronta).
>>>
>>> Algu?m com menos ?lcool no sangue que eu pode por favor apontar os
> m?dulos
>>> no CPAN para o Guilherme?
>>>
>>> Putamplexos!
>>> --
>>> Luis Motta Campos is a software engineer,
>>> Perl Programmer, foodie and photographer.
>>> _______________________________________________
>>> SaoPaulo-pm mailing list
>>> SaoPaulo-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>>
>>
>>
>> ------------------------------
>>
>> _______________________________________________
>> SaoPaulo-pm mailing list
>> SaoPaulo-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>> End of SaoPaulo-pm Digest, Vol 53, Issue 4
>> ******************************************
>>
>
>
> ------------------------------
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
> End of SaoPaulo-pm Digest, Vol 53, Issue 5
> ******************************************
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>


More information about the SaoPaulo-pm mailing list