[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