Через два с половиной года после первого подхода к gearmand мне захотелось (и появилась подходящая задача) попробовать его еще раз. Лучший способ вспомнить, как и что, — запустить примитивный пример.
Gearman — интересный и простой планировщик задач, серверная часть которого теперь существует и на C (а раньше была только перловая версия). Разрозненность документации (если говорить про Perl), правда, осталась на прежнем уровне. Как и необновленные ссылки на дистрибутив на основном сайте и потерянные симлинки после установки :-)
Итого. Что нужно.
1) Установить gearmand-демон (сервер).
./configure
make
make install
2) Установить модули для воркеров и клиентов.
cpan Gearman::Client
3) Запустить один или несколько серверов.
gearmand -d
4) Запустить один или несколько (например, на разных машинах) воркеров, которые подключить к единому серверу.
./worker.pl
5) Вызвать клиента и убедиться, что он работает даже когда один из воркеров не запущен.
./client.pl
При создании воркеров и клиентов нужно сразу учесть, что они ожидают номер порта. Воркер — это Gearman::Worker, а клиент — Gearman::Client, в остальном же работа с ними очень похожа.
Методу, исполняющему задачу, воркер передает аргумент типа Gearman::Job.
Воркер
Я запустил два воркера на разных компьютерах: один уменьшал полученный аргумент на единицу, а другой — увеличивал.
#!/usr/bin/perl
use v5.10;
use strict;
use Gearman::Worker;
my $worker = new Gearman::Worker;
$worker->job_servers('example.com:4730');
$worker->register_function(echo => \&echo);
$worker->work while 1;
sub echo {
my $job = shift;
say '+1';
return $job->arg + 1;
}
Клиент
#!/usr/bin/perl
use v5.10;
use strict;
use Gearman::Client;
my $client = new Gearman::Client;
$client->job_servers('example.com:4730');
for (1..10000) {
my $result_ref = $client->do_task('echo', 10);
say $$result_ref;
}
Клиенты тоже интересно запускать на двух разных компьютерах и смотреть на печать и воркеров, и клиентов (можно еще смотреть и на логи сервера geramand, но это менее впечатляюще).
XS-вариант клиента тоже попробую.
Спаcибо за эту информацию - завяжу узелок на память.
Как я понял количество процессов с Gearman::Worker надо контролировать самому? А как? Job сервер может вернуть информацию о размере очереди с работами?
Самому. Вообще узнать текущее состояние задач, их число и пр., — не самая простая задача при работе с Gearman. Можно попробовать самостоятельно считать время простоя воркеров и запускать новые.
Мысли вслух.
Интересно, а AnyEvent::Gearman::Worker может выполнять несколько задач одновременно?
А есть вообще в сервере поддержка этой позможности?
Про AnyEvent ничего не знаю. А поддержка «связок» задач есть.
А если в примерах кода вместо "example.com" написать "localhost", то скрипты работали бы "из коробки".