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