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 サブルーチンを呼び出していません。サブルーチンへの参照を逆参照しているだけです。このイディオムは、通常、実際にサブ参照 (またはサブ参照オーバーロードを持つオブジェクト) があることを確認するために、内部で使用され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 に答える