Простейший синхронный вызов методов, предоставляемых воркерами geramand, не так интересен, как асинхронный, тем более, что работа может выполняться на другой машине и на время выполнения задачи нет смысла останавливать процесс.
Gearman::Client предоставляет возможность установить обработчики, которые будут вызваны по завершении задачи (или после неудачи).
Чтобы воспользоваться этим механизмом, требуется создать набор задач (task set), и добавить в него задачу, указав адрес колбека.
#!/usr/bin/perl
use v5.10;
use strict;
use Gearman::Client;
my $client = new Gearman::Client;
$client->job_servers('example.com:4730');
my $tasks = $client->new_task_set;
$tasks->add_task(
'echo' => 10,
{
on_complete => \&completed
}
);
$tasks->wait;
sub completed {
my $result = shift;
say $$result;
}
Функция completed получает ссылку на данные, которые возвращает соответствующий воркер.
Если необходимо дождаться результата, нужно на наборе задач вызвать метод wait. Иначе колбек не будет инициирован (хотя задача и выполнится).
Кстати, надо использовать Gearman::XS "A Perl module that wraps the libgearman C library."