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 <[email protected]> > > On Sep 19, 2013, at 3:41 PM, Renato Santos <[email protected]> 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: [email protected] > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > -- Tiago B. Peczenyj Linux User #405772 http://about.me/peczenyj
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: [email protected] L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer
