2011-11-09 91 views
2

背景: 我对多进程Perl脚本没有太多经验。我有一个数据清理过程,需要花费12个小时才能完成,当我调查时,我发现几乎所有的时间都花在等待FooClient返回数据。我正在研究一个多进程的方式来完成这个任务,并且一位同事通过我之前做的简单的fork()来推荐Parallel :: Fork :: BossWorkerAsync。我喜欢它,因为它降低了我的记忆使用量。我是否正确使用Parallel :: Fork :: BossWorkerAsync?

问题: BossWorkerAsync看起来非常整洁,perldoc非常棒,并且在非写入测试模式下运行非常好,我的执行时间不到一个小时。我唯一的问题是文档没有真正解释共享数据如何与“init_handler => & x”构造设置一起工作。我希望每个工作人员都有自己的FooClient,以避免任何类型的同步问题。我以我认为正确的方式进行了尝试,但我对此有点偏执,并且还想确保我以最正确的方式处理这个问题。

代码:

# The number of children to spawn, modify after performance testing 
Readonly my $CHILDREN => 40; 

# Each child will set their own client 
my $client; 

my $bw = Parallel::Fork::BossWorkerAsync->new(
    work_handler => \&process_keys, 
    init_handler => \&setup_client, 
    worker_count => $CHILDREN, 
); 

send_work($bw); 

while ($bw->pending()) { 
    my $ref = $bw->get_result(); 
    # Do stuff with the result 
} 

$bw->shut_down(); 
exit; 

sub setup_client { 
    $client = FooClient->new(); 
} 

上午我处理,我不想正确共享$客户端?我保留了与fork()版本相同的处理方式,我在fork()之后设置了$ client,但我担心这不是正确的方法。

回答

2

是的,你正在使用模块和init_handler。处理程序在每个子进程中在fork之后被调用,然后进入阻塞选择循环,等待工作。

我是该模块的作者。对不起,我花了这么长时间才注意到这一点,并作出回应。很高兴看到代码被使用。

干杯, -joe

+0

谢谢!到目前为止,该脚本自11月份开始投入生产,运行良好,但很高兴知道它没有做任何错事=) – Danalog