Правильно ли я использую 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 2

1 ответ:

Да, вы используете модуль и init_handler правильно. Обработчик вызывается сразу после вилки, в каждом дочернем элементе, прежде чем он входит в блокирующий цикл выбора, ожидая задания.

Я автор модуля. Мне жаль, что мне потребовалось так много времени, чтобы заметить это и ответить. Рад видеть, что код используется.

Ура!, - Джо