Я правильно использую Parallel :: Fork :: BossWorkerAsync? - PullRequest
2 голосов
/ 09 ноября 2011

Справочная информация: У меня не было большого опыта работы с многопроцессорными скриптами 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 (), но я просто беспокоюсь, что это неправильный способ сделать это.

1 Ответ

2 голосов
/ 02 февраля 2012

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

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

Ура, -joe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...