2012-08-16 75 views
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方法被调用,但该进程处理永远不会被调用。 我在这里错过了什么? Thread::Pool::Simple

感谢,

+1

好吧,你从来不叫'$ TP - > _ do_handle()',所以....你是怎么想到要发生? – 2012-08-16 17:26:22

+0

它看起来像Thread :: Pool :: Simple有一个相当简单的API,你可能会更好地创建你的对象来代理调用它创建的TPS对象。 – 2012-08-16 20:12:42

回答

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); 
}; 
+0

_do_handle是Thread :: Pool :: Simple的一个回调函数,调用它就像你刚刚提到的那样只会调用它一次,而不是每个工作人员... – snoofkin 2012-08-16 17:30:48

+0

MooseX :: InsideOut因为Thread :: Pool :: Simple isnt祝福一个hashref ....或者我应该再次检查它,尝试了几个模块...无论如何,它不适用于MooseX :: NonMoose以及 – snoofkin 2012-08-16 17:31:35

+0

@ soulSurfer2010:以及如果你想要在与对象构造不同的时间调用某个东西,请不要在'BUILDARGS'中打电话。 – Ether 2012-08-16 17:32:28

相关问题