Acho que vale mais a pena perder um tempo (se houver disponível) um gerenciador de fila que nem o RabbitMQ ou X (sendo X o que você achar mais bonito) e usar publisher/subscriber para não ter que haver pooling, sem contar que o sistema deve garantir a entrega de mensagens e outras cositas mais.

[]'s
Alceu

Em 19-09-2013 16:57, Tiago Peczenyj escreveu:
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] <mailto:[email protected]>>


    On Sep 19, 2013, at 3:41 PM, Renato Santos <[email protected]
    <mailto:[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]
    <mailto:[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


=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

Responder a