Será que você deveria mesmo enviar a string com o código, ou um objeto serializado??? Vou dar uma olhada nesse módulo.<br><br><br><br>Cheers!<br><br><div class="gmail_quote">Em 21 de maio de 2010 04:14, Daniel de Oliveira Mantovani <span dir="ltr"><<a href="mailto:daniel.oliveira.mantovani@gmail.com">daniel.oliveira.mantovani@gmail.com</a>></span> escreveu:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Cometi um erro de digitação,<br>
<br>
no, <a href="http://cliente_envia_classe.pl" target="_blank">cliente_envia_classe.pl</a><br>
<br>
Ao invés de ser:<br>
<div class="im">my $result_ref = $client->do_task( "load_spider" => "@code");<br>
<br>
</div>é:<br>
<div class="im">my $result_ref = $client->do_task( "load_spider" => "$code");<br>
<br>
</div>[]'s<br>
<br>
<br>
2010/5/21 Daniel de Oliveira Mantovani <<a href="mailto:daniel.oliveira.mantovani@gmail.com">daniel.oliveira.mantovani@gmail.com</a>>:<br>
<div><div></div><div class="h5">> Estou usando o Gearman para fazer programação distribuída. Para quem<br>
> não conhece,<br>
> <a href="http://gearman.org/index.php" target="_blank">http://gearman.org/index.php</a><br>
><br>
> Eu quero fazer uma classe e essa classe ser executa em qualquer "worker".<br>
><br>
> Para simplificar:<br>
><br>
> arquivo:Foo.pm<br>
><br>
> package Foo;<br>
><br>
> sub new {<br>
> my $class = shift;<br>
> $class = ref $class || $class;<br>
> my $argv = {@_};<br>
> return bless($argv,$class);<br>
> }<br>
><br>
> sub foo {<br>
> my $self = shift;<br>
> $self->{'foo'} = "@_";<br>
> }<br>
><br>
> 42;<br>
><br>
> fim:Foo.pm<br>
><br>
> Bom, para usar essa classe normalmente fazemos,<br>
><br>
> arquivo:<a href="http://teste.pl" target="_blank">teste.pl</a><br>
><br>
> #!/usr/bin/perl<br>
><br>
> use strict;<br>
> use warnings;<br>
> use 5.10.0;<br>
> use Foo;<br>
><br>
> my $o = Foo->new;<br>
> say $o->foo(qw(Hello World));<br>
><br>
> fim:<a href="http://teste.pl" target="_blank">teste.pl</a><br>
><br>
> Certo, é isso que eu quero fazer mas o "Foo.pm" vai ser "dinâmico".<br>
> Eu quero fazer programação distribuída e executar o "Foo.pm" que no<br>
> caso será um Web Scrap. Ou seja eu tenho vários serviços[0] rodando em<br>
> servidores no mundo inteiro.<br>
> Analisando a arquitetura do Gearman, eu quero enviar uma "classe" para<br>
> o meu worker, que no caso vai ser um Web Scrap. Por exemplo, um da<br>
> Amazon.<br>
><br>
><br>
> O worker funciona da seguinte maneira,<br>
><br>
> arquivo:<a href="http://worker.pl" target="_blank">worker.pl</a><br>
><br>
> use strict;use warnings;<br>
> use Gearman::Worker;<br>
> my $worker = Gearman::Worker->new;<br>
> $worker->job_servers('xxx.xxx.xxx.xxx:4730');<br>
> $worker->register_function( 'load_spider' => \&foo );<br>
> $worker->work while 1;<br>
><br>
> sub foo {<br>
> return(shift->arg);<br>
> }<br>
><br>
> fim:<a href="http://worker.pl" target="_blank">worker.pl</a><br>
><br>
><br>
> e o cliente,<br>
><br>
> file:<a href="http://cliente.pl" target="_blank">cliente.pl</a><br>
><br>
> use strict;use warnings;<br>
> use Gearman::Client;<br>
><br>
> my $client = Gearman::Client->new;<br>
> $client->job_servers('xxx.xxx.xxx.xxx:4730');<br>
> my $result_ref = $client->do_task( "load_spider" => "Foo" );<br>
> print "${$result_ref}\n";<br>
><br>
> fim:<a href="http://cliente.pl" target="_blank">cliente.pl</a><br>
><br>
> O resultado será, ao executar o <a href="http://cliente.pl" target="_blank">cliente.pl</a>:<br>
> $Foo<br>
><br>
> Até aqui ótimo, só que ao invés de passar simplesmente um arquivo para<br>
> uma função, eu quero passar uma classe inteira com o meu Web Scrap.<br>
><br>
> Um exemplo de como fazer isso localmente:<br>
><br>
> arquivo:<a href="http://local.pl" target="_blank">local.pl</a><br>
><br>
> use strict;<br>
> use warnings;<br>
> use 5.10.0;<br>
><br>
> open my $file,'<','File.pm' or die $!;<br>
> my @classe = <$file>;<br>
> eval "@classe";<br>
> my $o = Foo->new;<br>
> say $o->foo(qw(Hello World));<br>
><br>
> fim:<a href="http://local.pl" target="_blank">local.pl</a><br>
><br>
> Vai imprimir, "Hello World". Eu quero deixar claro que eu *preciso*<br>
> fazer as classes serem "dinâmicas", porque eu vou fazer o Web Scrap<br>
> local. E quando eu quiser executa-lo eu simplesmente escolho o melhor<br>
> servidor, que no caso o Gearman vai fazer isso (escolher o melhor<br>
> servidor).<br>
><br>
><br>
> Agora, como fazer isso, como está no <a href="http://local.pl" target="_blank">local.pl</a>, mandar a "@classe" para<br>
> o worker ?<br>
><br>
> arquivo:<a href="http://worker_carregar_classe.pl" target="_blank">worker_carregar_classe.pl</a><br>
><br>
> use strict;<br>
> use warnings;<br>
><br>
> use Gearman::Worker;<br>
><br>
> my $worker = Gearman::Worker->new;<br>
> $worker->job_servers('xxx.xxx.xxx.xxx:4730');<br>
> $worker->register_function( 'load_spider' => \&foo );<br>
> $worker->work while 1;<br>
><br>
> sub foo {<br>
> eval shift->arg; print $@ if $@;<br>
> my $o = Foo->new();<br>
> return($o->foo("Bar"));<br>
> }<br>
><br>
> fim:<a href="http://worker_carregar_classe.pl" target="_blank">worker_carregar_classe.pl</a><br>
><br>
><br>
> Pronto, o worker vai receber a string que contém o pacote todo em<br>
> "shift->arg" o eval vai executar o código que vai carregar a classe<br>
> para memória e eu vou poder fazer Foo::new.<br>
><br>
> O cliente para mandar a string que contém o código pacote, para o<br>
> <a href="http://worker_carrega_classe.pl" target="_blank">worker_carrega_classe.pl</a><br>
><br>
> arquivo:<a href="http://cliente_envia_classe.pl" target="_blank">cliente_envia_classe.pl</a><br>
><br>
> use strict;<br>
> use warnings;<br>
> use Gearman::Client;<br>
><br>
> my $client = Gearman::Client->new;<br>
> $client->job_servers('187.22.189.149:4730');<br>
><br>
> open my $spider, '<', 'Submarino.pm' or die $!;<br>
> my @go_spider = <$spider>;<br>
> my $code = "@go_spider";<br>
> my $result_ref = $client->do_task( "load_spider" => "@code");<br>
> print "${$result_ref}\n";<br>
><br>
> fim:<a href="http://cliente_envia_classe.pl" target="_blank">cliente_envia_classe.pl</a><br>
><br>
> Pronto, isso seria perfeito e deveria funcionar. Mas não funciona,<br>
> quando eu tento passar uma string que contém o código de uma classe.<br>
> Simplesmente o worker não responde. Ele funciona perfeitamente se você<br>
> passa só um argumento como, "hello" como no exemplo. O problema não é<br>
> no worker, eu posso retirar a função que contém o eval, e só deixar um<br>
> print "Hello World", por exemplo que continua não funcionando. O único<br>
> modo de fazer funcionar é retirando o "@code" como parâmetro e<br>
> colocando coisas como, "foo","bar". Se eu tento passar o código de uma<br>
> classe ele não aceita, nem ao menos chega ao "eval".<br>
><br>
> Gostaria da ajuda de vocês, para saber uma maneira de fazer o que eu<br>
> citei acima.<br>
><br>
> Obrigado<br>
><br>
> []'s<br>
><br>
><br>
><br>
><br>
> --<br>
> "If you’ve never written anything thoughtful, then you’ve never had<br>
> any difficult, important, or interesting thoughts. That’s the secret:<br>
> people who don’t write, are people who don’t think."<br>
><br>
<br>
<br>
<br>
--<br>
"If you’ve never written anything thoughtful, then you’ve never had<br>
any difficult, important, or interesting thoughts. That’s the secret:<br>
people who don’t write, are people who don’t think."<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>André Garcia Carneiro<br>Analista/Desenvolvedor Perl<br>(11)82907780<br>