2012-08-16 73 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

相關問題