3

我有以下类/包:

package Data::CrawlerThreadPool;
use Moose;
use MooseX::InsideOut;
use MooseX::NonMoose;

extends 'Thread::Pool::Simple';

around BUILDARGS => sub {
      my $orig  = shift;
      my $class = shift;
      return $class->$orig( do  => [\&_do_handle],
                            min => 5,
                            max => 10 );
};

sub _do_handle {
    $| = 1;
    print "In Do handle";
}
1;

在我的主脚本中,我这样称呼它(例如..):

#!/usr/bin/env perl
use strict;
use warnings;
use Data::CrawlerThreadPool;

my $tp = Data::CrawlerThreadPool->new();
my @args = qw(0 0 0 0 0 0 0 0 0);
$tp->add(@args) for (0..10);
$tp->join();

似乎调用了 BUILDARGS 方法,但该进程确实处理从未被调用过。我在这里想念什么? 线程::池::简单

谢谢,

4

1 回答 1

3

\&_do_handle没有调用 _do_handle 子 - 它只是取消引用对子的引用。这个习语通常在 an 内部使用eval {},以检查您是否真的有一个子引用(或一个具有子引用重载的对象)——我认为这不是您打算在这里做的。

如果您打算实际调用 _do_handle,则直接调用它:

around BUILDARGS => sub {
      my $orig  = shift;
      my $class = shift;
      return $class->$orig( do  => [ _do_handle() ],
                            min => 5,
                            max => 10 );
};
于 2012-08-16T17:27:21.820 回答