Распараллеливание с редуктором


Я хочу распараллелить задание обработки, уже обработанное Gearman и PHP. Я не понимаю разницы между вызовом doBackground() много раз:

$gmclient->doBackground("reverse", "Hello!");
$gmclient->doBackground("reverse", "Hello!");
$gmclient->doBackground("reverse", "Hello!");

У меня достаточно зарегистрированных работников, работающих на своем собственном PID. Таким образом, 3 задания выполняются параллельно 3 разными работниками.

Или использование addTask(), как сказано в документах, явно для распараллеливания.

$gmc->addTask("reverse", "Hello World!", null, "1");
$gmc->addTask("reverse", "!dlroW olleH", null, "2");
$gmc->addTask("reverse", "!dlroW olleH", null, "3");

$gmc->runTasks()

Спасибо за вашу помощь

Author: Jason Lince, 2012-05-01

2 answers

Разница в том, что runTasks() будет блокироваться до тех пор, пока не будут выполнены все задачи, добавленные через addTask(). Ваш последний пример завершится, когда будут выполнены все три задачи (добавьте вызов sleep(), чтобы увидеть это на практике), в то время как первый просто передаст задачи в gearmand, а затем продолжит выполнение сценария.

Использование addTask() для группировки независимых задач (но, возможно, связанных) упрощает выполнение набора задач перед выполнением операции, которая предполагает, что все предыдущие задачи было завершено. Примером может быть изменение размера изображений в 4 разных разрешениях, а затем установка изображения в качестве активного после выполнения всех четырех задач. С помощью runTasks() это легко реализуется с помощью четырех вызовов addTask(), одного runTasks(), а затем изменения статуса изображения, в то время как с помощью doBackground вам придется опросить состояние задач, которые вы отправили в gearmand, чтобы узнать, когда они будут завершены.

 4
Author: MatsLindh, 2012-05-02 13:18:35

Здесь следует отметить один хороший момент:

Если ваш работник мертв или недоступен, doBackground будет намного лучше, потому что gearman все равно получит рабочую нагрузку, а не будет ждать, ПОКА появится Работник, и сделает это за вас, и в большинстве случаев (по крайней мере, по моему опыту) вы используете gearman для работы таким образом, чтобы отправлять задачи, рабочие нагрузки и ждать, пока они будут выполнены асинхронно.

Поэтому, если ваша система должна быть отказоустойчивой, вам, вероятно, следует использовать doBackground вместо AddTask.... в противном случае, если вам нужен СИЛЬНЫЙ контроль над вашей задачей, то AddTask будет лучше.

Надеюсь, что это может решить и для других людей...

 3
Author: Klederson Bueno, 2013-09-25 19:18:47