Как правильно открыть трубу (и) с лосем? - PullRequest
3 голосов
/ 05 июля 2011

Я все еще новичок в лосях, но это заставляет меня пускать слюни! Ниже приведена упрощенная версия того, что я хотел бы сделать: генерировать объектно-зависимые входные файлы, которые можно использовать для запуска внешней программы. Эти внешние программы могут быть интенсивными в вычислительном отношении, и я буду многократно обрабатывать вывод обратно в объекты для многих объектов (в зависимости от настройки некоторых внешних параметров). Модуль ниже работает (я думаю), но, возможно, есть лучшие / более чистые способы сделать это. Как правильно это сделать? Поскольку все эти объекты живут в своем собственном маленьком мире, мне кажется, что я должен иметь возможность запускать их параллельно, чтобы эффективно разбирать коллекцию объектов. Любые советы для этого! ??

{
package input_genrun;                                              
use Moose;                                                         
use IO::Pipe;                                                      
use FileHandle;                                                    

has 'name', is => 'ro', isa =>'Str';
has 'exe'      => (                 
                    is  => 'ro',    
                    isa => 'Str',   
                    default => '/usr/local/bin/bar',
                  );
has 'inp_fh'   => (
                    is => 'rw',
                    isa=> 'FileHandle',
                    default => sub {
                      my $handle = FileHandle->new;
                      return $handle;
                    }
                  );
has 'out_fh'   => (
                    is => 'rw',
                    isa=> 'IO::Pipe',
                    default => sub {
                      my $handle = IO::Pipe->new;
                      return $handle;
                    }
                  );

sub inp_wrt
{
  my ($self,$object) = @_;
  my $filename = $object->name() . ".inp";
  my $fh = FileHandle->new;
  $fh->open(">" . $filename);
  print $fh "foo \n";
  print $fh "bar \n";
  $fh->close;
}

sub run
{
  my ($self, $object) = @_;
  my $name = $object->name() . ".inp";
  my $exe = $self->exe;
  my $command = $self->exe . " $name";
  $self->out_fh()->reader($command);
  return($self->out_fh());
}

} 

my $l = input_genrun->new(name=> 'foo_l',exe=> 'wc');
my $m = input_genrun->new(name=> 'foo_m',exe=> 'cat');
my $n = input_genrun->new(name=> 'foo_n',exe=> 'tac');

$l->inp_wrt($l);
$m->inp_wrt($m);
$n->inp_wrt($n);

my $pipe_l = $l->run($l);
my $pipe_m = $m->run($m);
my $pipe_n = $n->run($n);

while (<$pipe_l>){
  print "from_l: $_";
}
while (<$pipe_m>){
  print "from_m: $_";
}
while (<$pipe_n>){
  print "from_n: $_";
}

1 Ответ

3 голосов
/ 06 июля 2011

Я бы начал с взгляда на MooseX::Workers, который обобщается вокруг POE::Wheel::Run, чтобы решить эту же проблему.В противном случае я бы посмотрел на ряд других асинхронных обработчиков заданий (Parallel::Fork, Proc::Simple::Async, Gearman и т. Д.), Прежде чем снова приступить к реализации колеса.

Еслибольше ничего они не дадут вам хорошего представления о том, что было сделано ранее в этом пространстве.

...