[SP-pm] SaoPaulo-pm Digest, Vol 53, Issue 4
Guilherme Eberhardt
guilherme.eberhardt at gmail.com
Tue Feb 3 16:41:24 PST 2009
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 at pm.org>:
> Send SaoPaulo-pm mailing list submissions to
> saopaulo-pm at 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 at pm.org
>
> You can reach the person managing the list at
> saopaulo-pm-owner at 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 at yahoo.co.uk>
> Subject: [SP-pm] Boas vindas ao Guilherme Luis Eberhardt
> To: saopaulo-pm at mail.pm.org
> Message-ID: <4988B29B.7030802 at yahoo.co.uk>
> Content-Type: text/plain; charset=ISO-8859-1; format=flowed
>
> mailman-bounces at 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 at yahoo.co.uk>
> Subject: Re: [SP-pm] Threads em Perl
> To: saopaulo-pm at mail.pm.org
> Message-ID: <4988B39B.4030906 at 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 at gmail.com>
> Subject: Re: [SP-pm] Catalyst: Come?ando...
> To: saopaulo-pm at mail.pm.org
> Message-ID:
> <604cec170902031345r36610592pab03646ac5bd302e at 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 at 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çã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 at aware.com.br>
>
> =head1 COLABORADORES
>
>
> ------------------------------
>
> Message: 4
> Date: Tue, 3 Feb 2009 22:29:14 -0200
> From: Blabos de Blebe <blabos at gmail.com>
> Subject: Re: [SP-pm] Threads em Perl
> To: saopaulo-pm at mail.pm.org
> Message-ID:
> <179354400902031629o283468d7g15ba6a677ce2e916 at 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 at 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 at pm.org
>> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>>
>
>
> ------------------------------
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm at pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
> End of SaoPaulo-pm Digest, Vol 53, Issue 4
> ******************************************
>
More information about the SaoPaulo-pm
mailing list