背景: 我对多进程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,但我担心这不是正确的方法。
谢谢!到目前为止,该脚本自11月份开始投入生产,运行良好,但很高兴知道它没有做任何错事=) – Danalog