Правильно ли я использую Parallel:: Fork:: BossWorkerAsync?
Фон: У меня не было большого опыта работы с многопроцессными скриптами Perl. У меня есть процесс очистки данных для Fooslient, который занимает более 12 часов, и когда я исследовал, я обнаружил, что почти все это время было потрачено на ожидание FooClient, чтобы вернуть мне данные. Я искал многопроцессный способ выполнения задачи, и коллега рекомендовал Parallel::Fork::BossWorkerAsync вместо простого fork (), который я делал раньше. Мне это понравилось, так как это снизило использование моей памяти на a тонна.
Проблема: BossWorkerAsync выглядит довольно аккуратно, perldoc великолепен, и запуск его в тестовом режиме no-write работает очень хорошо, что сокращает время выполнения до часа. Моя единственная проблема заключается в том, что документация на самом деле не объясняет, как общие данные работают с параметром "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 (), где я установил $client после fork (), но я просто беспокоюсь, что это не правильный способ сделать это.
1 ответ:
Да, вы используете модуль и init_handler правильно. Обработчик вызывается сразу после вилки, в каждом дочернем элементе, прежде чем он входит в блокирующий цикл выбора, ожидая задания.
Я автор модуля. Мне жаль, что мне потребовалось так много времени, чтобы заметить это и ответить. Рад видеть, что код используется.
Ура!, - Джо