[SP-pm] Jobs

Gabriel Andrade gabiruh at gmail.com
Thu Sep 19 12:21:38 PDT 2013


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;



More information about the SaoPaulo-pm mailing list