GearmanClient::addTaskBackground

(PECL gearman >= 0.5.0)

GearmanClient::addTaskBackgroundДобавить фоновую задачу для работы в параллельном режиме

Описание

public GearmanClient::addTaskBackground ( string $function_name , string $workload [, mixed &$context [, string $unique ]] ) : GearmanTask

Добавляет фоновую задачу для параллельной работы с другими задачами. Вызовите этот метод для всех задач, которые будут работать параллельно, а затем вызовите GearmanClient::runTasks() для выполнения работ.

Список параметров

function_name

Зарегистрированная функция, вызываемая рабочим процессом

workload

Сериализованные данные, подлежащие обработке

context

Контекст приложения, связываемый с задачей

unique

Уникальный ID, назначаемый определенной задаче

Возвращаемые значения

Объект GearmanTask или FALSE, если задача не может быть добавлена.

Примеры

Пример #1 Две задачи, одна в фоновом режиме, а другая нет

Этот пример иллюстрирует различие между выполнением фоновой задачи и обычной задачей. Клиент добавляет две задачи для выполнения одних и тех же функций, но одна добавлена с помощью addTaskBackground(). Callback-функция установлена так, чтобы выполнение задания можно было проследить. Простой обработчик с искусственной задержкой сообщает статус выполнения задания, и клиент понимает это посредством вызова callback-функции. Два обработчика запущены для этого примера. Обратите внимание, что фоновая задача не показывается в клиентском выводе.

<?php

# Клиентский скрипт

# Создание нашего клиента
$gmc= new GearmanClient();

# Добавление сервера задач по умолчанию
$gmc->addServer();

# Установка нескольких callback-функций. Таким образом, мы сможем отслеживать выполнение
$gmc->setCompleteCallback("reverse_complete");
$gmc->setStatusCallback("reverse_status");

# Добавление задачи для функции reverse
$task$gmc->addTask("reverse""Hello World!"null"1");

# Добавление другой задачи, но она предназначена для запуска в фоновом режиме
$task$gmc->addTaskBackground("reverse""!dlroW olleH"null"2");

if (! 
$gmc->runTasks())
{
    echo 
"Ошибка " $gmc->error() . "\n";
    exit;
}

echo 
"Выполнено\n";

function 
reverse_status($task)
{
    echo 
"Статус: " $task->unique() . ", " $task->jobHandle() . " - " $task->taskNumerator() . 
         
"/" $task->taskDenominator() . "\n";
}

function 
reverse_complete($task)
{
    echo 
"Завершено: " $task->unique() . ", " $task->data() . "\n";
}

?>
<?php

# Скрипт обработчика

echo "Начало\n";

# Создаем наш объект обработчика
$gmworker= new GearmanWorker();

# Добавление сервера задач по умолчанию (localhost).
$gmworker->addServer();

# Регистрируем функцию reverse на сервере
$gmworker->addFunction("reverse""reverse_fn");

print 
"Ожидание задачи...\n";
while(
$gmworker->work())
{
  if (
$gmworker->returnCode() != GEARMAN_SUCCESS)
  {
    echo 
"код возврата: " $gmworker->returnCode() . "\n";
    break;
  }
}

function 
reverse_fn($job)
{
  echo 
"Полученная задача: " $job->handle() . "\n";

  
$workload $job->workload();
  
$workload_size $job->workloadSize();

  echo 
"Рабочая нагрузка: $workload ($workload_size)\n";

  
# В этом цикле для отображения статуса нет необходимости. Просто для демонстрации, как это работает
  
for ($x0$x $workload_size$x++)
  {
    echo 
"Отправка статуса: " . ($x 1) . "/$workload_size выполнено\n";
    
$job->sendStatus($x+1$workload_size);
    
$job->sendData(substr($workload$x1));
    
sleep(1);
  }

  
$resultstrrev($workload);
  echo 
"Результат: $result\n";

  
# Возвращаем то, что мы хотим вернуть клиенту
  
return $result;
}

?>

Вывод рабочего для двух запущенных работников:

Полученная задача: H:foo.local:65
Рабочая нагрузка: !dlroW olleH (12)
1/12 выполнено
Полученная задача: H:foo.local:66
Рабочая нагрузка: Hello World! (12)
Отправка статуса: 1/12 выполнено
Отправка статуса: 2/12 выполнено
Отправка статуса: 2/12 выполнено
Отправка статуса: 3/12 выполнено
Отправка статуса: 3/12 выполнено
Отправка статуса: 4/12 выполнено
Отправка статуса: 4/12 выполнено
Отправка статуса: 5/12 выполнено
Отправка статуса: 5/12 выполнено
Отправка статуса: 6/12 выполнено
Отправка статуса: 6/12 выполнено
Отправка статуса: 7/12 выполнено
Отправка статуса: 7/12 выполнено
Отправка статуса: 8/12 выполнено
Отправка статуса: 8/12 выполнено
Отправка статуса: 9/12 выполнено
Отправка статуса: 9/12 выполнено
Отправка статуса: 10/12 выполнено
Отправка статуса: 10/12 выполнено
Отправка статуса: 11/12 выполнено
Отправка статуса: 11/12 выполнено
Отправка статуса: 12/12 выполнено
Отправка статуса: 12/12 выполнено
Результат: !dlroW olleH
Результат: Hello World!

Клиент выводит:

Статус: 1, H:foo.local:66 - 1/12
Статус: 1, H:foo.local:66 - 2/12
Статус: 1, H:foo.local:66 - 3/12
Статус: 1, H:foo.local:66 - 4/12
Статус: 1, H:foo.local:66 - 5/12
Статус: 1, H:foo.local:66 - 6/12
Статус: 1, H:foo.local:66 - 7/12
Статус: 1, H:foo.local:66 - 8/12
Статус: 1, H:foo.local:66 - 9/12
Статус: 1, H:foo.local:66 - 10/12
Статус: 1, H:foo.local:66 - 11/12
Статус: 1, H:foo.local:66 - 12/12
Завершено: 1, !dlroW olleH
Выполнено

Смотрите также

  • GearmanClient::addTask() - Добавить задачу, которая будет выполнена в параллельном режиме
  • GearmanClient::addTaskHigh() - Добавить высокоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskLow() - Добавить низкоприоритетную задачу для работы в параллельном режиме
  • GearmanClient::addTaskHighBackground() - Добавить высокоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::addTaskLowBackground() - Добавить низкоприоритетную фоновую задачу для работы в параллельном режиме
  • GearmanClient::runTasks() - Запустить список задач в параллельном режиме