Переделка скрипта для работы с Gearman весьма проста, если решение задачи запрограммировано таким образом, чтобы у нее были только вход и выход :-) В случае со вчерашним примером функция поиска, помещенная в воркер, состоит из двух строк:
sub search {
my $job = shift;
return MySearch::search($job->arg);
}
Клиентский код несколько усложняется: сначала необходимо создать пул задач, а затем дождаться их выполнения:
for (qw (red orange yellow green blue violet)) {
$tasks->add_task(
'search' => "$_ $text",
{
on_complete => \&search_completed
}
);
}
$tasks->wait;
Сбор данных по окончании каждой задачи тоже крайне прост:
sub search_completed {
my $result = shift;
$html_result .= $$result;
}
Теперь осталось запустить с десяток отдельных воркеров, и скорость работы тестового скрипта возрастает на порядок: последовательные запросы на поиск картинок шести цветов зарубежной радуги завершались за 1-3 секунды, после модернизации — за 0,1-0,6. Задачи параллелятся на ура, но важно понимать, что это имеет смысл только для тех задач, которые по своей природе проводят много времени в ожидании ответа, не тратя процессорное время локальной машины.
Комментировать