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