<div dir="ltr">uma coisa q eu fazia na globo era<div><br></div><div>preciso fazer X, então crio um arquivo X no diretorio "incoming"</div><div><br></div><div>tenho um processo q ficam fazendo pooling no diretorio incoming. chegou algo? move pra workdir e trabalha nele. terminou? manda pro outdir.</div>

<div><br></div><div>pra ter mais de um processo, basta ter mais de um workdir com alguma coisa diferenciando (vc cria processos P1 .. P4, workdir/P1 .. workdir/P4)</div><div><br></div><div>fora outras milhares de coisa. meh. puta trabalho.</div>

</div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/9/19 Gabriel Andrade <span dir="ltr"><<a href="mailto:gabiruh@gmail.com" target="_blank">gabiruh@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im"><br>
On Sep 19, 2013, at 3:41 PM, Renato Santos <<a href="mailto:renato.cron@gmail.com">renato.cron@gmail.com</a>> wrote:<br>
> $cliente_redis->rpush( $nome_da_fila => "json ou alguma coisa assim contendo o id/caminho da imagem" );<br>
><br>
><br>
> e ai, em um 'worker' você teria o código assim:<br>
><br>
> while (my $item_da_fila = get_item  ){<br>
>  ...<br>
> }<br>
><br>
><br>
> sub get_item {<br>
><br>
>    my ( $list, $item )  = $cliente_redis->blpop( $nome_da_fila, 0 );<br>
><br>
>    if (defined $item) {<br>
>          return decode_json $item<br>
>     }else{<br>
>         # timeout, mas como ta 0, nunca devieria entrar aqui!<br>
>     }<br>
> }<br>
><br>
><br>
> Ai você ainda pode ter, por exemplo, 10 workers, ou 100, etc..<br>
><br>
><br>
<br>
</div>Utilizando uma abordagem parecida com a que o Cron sugeriu, eu costumo já encapsular todas<br>
as ações específicas de uma tarefa em um objeto serializado em JSON utilizando<br>
o MooseX::Storage.<br>
<br>
O processo que consome a fila de-serializa o objeto e executa um método ->run(), por exemplo,<br>
que já sabe o que deve fazer.<br>
<br>
---<br>
<br>
package Role::Job;<br>
<br>
use Moose::Role<br>
use MooseX::Storage;<br>
with Storage( format => [ JSONpm => { json_opts => { utf8 => 1 } } ] );<br>
<br>
requires 'run';<br>
<br>
<br>
package Job::Foo;<br>
<br>
use Moose;<br>
with 'Role::Job';<br>
<br>
has quux;<br>
has bar;<br>
<br>
sub run {<br>
  my ($self, %args) = @_;<br>
  (...)<br>
}<br>
<br>
package Job;<br>
<br>
use Moose;<br>
<br>
use MooseX::Types::LoadableClass qw(LoadableClass);<br>
use JSON qw(decode_json);<br>
<br>
has queue;<br>
has logger;<br>
has db;<br>
<br>
sub collect {<br>
  my $self = shift;<br>
  while(my $msg = $self->queue->recv){<br>
    my $data       = decode_json($msg);<br>
    my $class_name = $data->{__CLASS__} or next;<br>
    my $job_class      = to_LoadableClass( $data->{__CLASS__} );<br>
<br>
    next unless $job_class;<br>
<br>
    my $job = $jog_class->thaw($json_msg);<br>
<br>
    $job->run( queue => $self->queue, db => $self->db, logger => $self->logger );<br>
  }<br>
}<br>
<br>
<br>
Aí, então é só fazer depois:<br>
<br>
  $queue->publish(fila_de_jobs => Job::Foo->new(bar => 2, quux => 'yomoma')->freeze);<br>
<br>
E em outro script:<br>
<br>
   use Worker;<br>
<br>
   Worker->new(db => $db, queue => $queue, logger => $logger)->collect;<br>
<div class="HOEnZb"><div class="h5"><br>
=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Tiago B. Peczenyj<br>Linux User #405772<br><br><a href="http://about.me/peczenyj" target="_blank">http://about.me/peczenyj</a>
</div>