Справочная информация:
У меня не было большого опыта работы с многопроцессорными скриптами Perl. У меня есть процесс очистки данных для FooService, который занимает более 12 часов, и когда я провел расследование, я обнаружил, что почти все это время было потрачено на ожидание, пока FooClient вернет мне данные. Я искал многопроцессный способ решения этой задачи, и коллега рекомендовал Parallel :: Fork :: BossWorkerAsync поверх простого fork (), который я делал ранее. Мне понравилось, так как это уменьшило мое использование памяти на тонну.
Проблема:
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();
}
Я правильно обращаюсь с $ client, которым не хочу делиться? Я заключил ту же сделку, что и с моей версией fork (), где я установил $ client после fork (), но я просто беспокоюсь, что это неправильный способ сделать это.