[SP-pm] Jobs

Tiago Peczenyj tiago.peczenyj at gmail.com
Thu Sep 19 12:57:45 PDT 2013


uma coisa q eu fazia na globo era

preciso fazer X, então crio um arquivo X no diretorio "incoming"

tenho um processo q ficam fazendo pooling no diretorio incoming. chegou
algo? move pra workdir e trabalha nele. terminou? manda pro outdir.

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)

fora outras milhares de coisa. meh. puta trabalho.


2013/9/19 Gabriel Andrade <gabiruh at gmail.com>

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



-- 
Tiago B. Peczenyj
Linux User #405772

http://about.me/peczenyj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130919/541793eb/attachment.html>


More information about the SaoPaulo-pm mailing list