Теперь настало время передвать более сложные аргументы, чем простые строки. Нет ничего проще — use Storable.
Перед тем, как передать задачу воркерам, упаковываем аргументы:
my $c = 0;
for (qw (red orange yellow green blue violet)) {
$tasks->add_task(
'search' => freeze([$c++, "$_ $text"]),
{
on_complete => \&search_completed
}
);
}
А внутри функции воркера — распаковываем:
my $request = thaw($job->arg);
my $result = MySearch::search($request->[1]);
После того, как получен результат, с ним потребуется произвести те же манипуляции, но в обратную сторону: заморозить (freeze) результат, вернуть серверу gearmand, а на клиентре — растопить (thaw).
Правда или нет, но передача данных от воркера в вызывающую задачу — глючит (особенно в Gearman::XS::Worker), да и бесконечные freeze/thaw только уродуют код. Намного удобнее, если воркер не будет ничего возвращать, а вместо этого складировать свои результаты в общее хранилище (например, в базу данных), доступное вызывающему приложению.
Спасибо за серию статей про Gearman, очень интересно!
А почему в заголовках написано Gera*** а не Gear***? Это феншуй или опечатка?
Что там написание. Произнести-то как — и то непонятно :-)