Рубрики
Uncategorized

Тематическое исследование по асинхронной обработке трудоемких задач с использованием процесса задач в PHP spool

Автор оригинала: David Wong.

В этой статье представлена асинхронная обработка трудоемких задач с использованием процесса задач в PHP spool. Подробности заключаются в следующем:

Как мы знаем, в spool есть два основных процесса, а именно процесс master master и процесс управления менеджером.

В главном основном процессе будет основной поток реактора и несколько потоков реактора, которые в основном используются для поддержания TCP-соединения, обработки сетевого ввода-вывода и отправки и приема данных.

Роль менеджера состоит в том, чтобы распределять и управлять рабочими и целевыми процессами.

Функция рабочего процесса состоит в том, чтобы получать данные, передаваемые потоком реактора, обрабатывать данные и возвращать результаты обработки потоку реактора.

Процесс выполнения задач используется для решения некоторых относительно трудоемких задач. Задача и рабочий процесс независимы, что не повлияет на рабочий процесс обработки запросов клиентов.

1. Сценарии применения процесса выполнения задач:

1. Относительно трудоемкая групповая отправка электронной почты, например, такие-то и такие-то действия, требует отправки активной электронной почты пользователям 100 Вт.

2. Нажмите на некоторые новости big V, например, большой V отправил новое сообщение, фанатам нужно вовремя получать новости.

2. Взаимосвязь между работником и задачей заключается в следующем

1. В рабочем процессе задачи могут быть доставлены вызовом task (), и процесс задачи отвечает на доставленные задачи через событие ontask.

2. Процесс выполнения задачи с помощью прямого возврата или завершения вызова () Чтобы сообщить рабочему процессу, что обработка задачи завершена, и рабочий процесс реагирует на завершение задачи с помощью события onfinish.

3, Перед использованием задачи:

1. Настройте задачу в номерном номере server_ worker_.

2. Установите на сервере функции обратного вызова событий on task и onfinish.

4, Простой пример расчета использования задачи для накопления и сумма

php
$server = new swoole_server('0.0.0.0', 6666);
 
$server->set([
  'worker_num' => 2,
  'task_worker_num' => 16,
]);
 
$server->on('WorkerStart', function ($server, $worker_id) {
  //Note here that we use task worker to determine whether it is a task process or a worker process
  // we need to call task () in the worker process, otherwise we will report a warning.
  //It will be executed twice here, because we set up the worker_ Num is 2
  if (!$server->taskworker) {
    echo  ' Delivery task starts ...',  PHP_ EOL ;
    //Deliver 32 cumulative computing tasks to 16 task processes
    for ($ix = 0; $ix < 32; $ix++) {
      //Note that the delivery here is asynchronous
      $server->task([mt_rand(1, 100), mt_rand(1000, 9999)]);
    }
    echo  ' End of delivery task ...',  PHP_ EOL ;
  }
});
 
//The server service must have an onReceive callback
$server->on('Receive', function ($server, $fd, $reactor_id, $data) {
 
});
 
//Note that the task process is completely in synchronous blocking mode
$server->on('Task', function ($server, $task_id, $src_worker_id, $data) {
  echo  " task  {$ task_ id }  The process is working ...",  PHP_ EOL ;
  $start = $data[0];
  $end = $data[1];
  $total = 0;
  for (; $start <= $end; $start++) {
    $total += $start;
  }
  echo "task {$task_ ID} process completes work... ", PHP_ EOL;
  return $total;
});
 
$server->on('Finish', function ($server, $task_id, $data) {
  echo "task {$task_ ID} process processing completed, the result is {$data} ", PHP_ EOL;
});
 
$server->start();

Обратите внимание, что мы отправляем задачи в пул задач, вызывая task (), и нижний слой катушки будет опрашивать, чтобы отправлять задачи в каждый процесс задачи.

Когда количество задач, которые вы публикуете, превышает скорость обработки задачи, это приведет к заполнению пула задач, а затем к блокировке рабочего процесса. Поэтому необходимо разумно ставить задачи работнику_ Взаимосвязь между числовым числом и скоростью обработки.

Конечно, мы также можем вручную размещать задачи в указанном процессе выполнения задач. Второй параметр функции task() может указывать идентификатор процесса задачи, который должен быть доставлен, и диапазон идентификаторов от 0 до (задача)_ номер работника_ – 1).

5. Задача сегментирована и управляется вручную для доставки в процесс выполнения задачи.

set([
  'worker_num' => 1,
  'task_worker_num' => 10,
]);
 
$server->on('WorkerStart', function ($server, $worker_id) {
  //In order to facilitate the demonstration, the worker_ Num is set to 1, which will only be executed once
  if (!$server->taskworker) {
    //Through swoole_ Table shared memory, shared data in different processes
    $server->result = new swoole_table(10240);
    //Used to save the number of tasks completed
    $server->result->column('finish_nums', swoole_table::TYPE_INT);
    //Used to save the final calculation results
    $server->result->column('result', swoole_table::TYPE_INT);
    $server->result->create();
    //Calculate the sum of 1000, and assign the task to 10 task processes
    $num = 1000;
    $step = $num / $server->setting['task_worker_num'];
    for ($ix = 0; $ix < $server->setting['task_worker_num']; $ix++) {
      $start = $ix * $step;
      $server->task([$start, $start + $step], $ix);
    }
  }
});
 
$server->on('Receive', function ($server, $fd, $reactor_id, $data) {
 
});
 
//Note that the task process is completely in synchronous blocking mode
$server->on('Task', function ($server, $task_id, $src_worker_id, $data) {
  echo "task {$task_ ID} process is working... Calculate {$data [0]} - {$data [1]} ", PHP_ EOL;
  $start = ++$data[0];
  $end = $data[1];
  $total = 0;
  for (; $start <= $end; $start++) {
    $total += $start;
  }
  echo "task {$task_ ID} process completes work... ", PHP_ EOL;
  return $total;
});
 
$server->on('Finish', function ($server, $task_id, $data) {
  echo "task {$task_ ID} process processing completed, the result is {$data} ", PHP_ EOL;
  $server->result->incr('finish_nums', 'finish_nums');
  $server->result->set('result', ['result' => $data + $server->result->get('result', 'result')]);
 
  if ($server->result->get('finish_nums', 'finish_nums') == $server->setting['task_worker_num']) {
    Echo "final calculation result: {$server > result > get ('result ','result')}", PHP_ EOL;
  }
});
 
$server->start();

Для получения дополнительной информации о PHP читатели, интересующиеся им, могут ознакомиться со следующими темами: краткое описание навыков сетевого программирования PHP, краткое описание использования сокетов PHP, вводный курс объектно-ориентированного программирования PHP, учебное пособие по структуре и алгоритму данных PHP и краткое описание алгоритма программирования PHP

Я надеюсь, что эта статья полезна для программирования на PHP.

Оригинал: “https://developpaper.com/case-study-on-asynchronous-processing-of-time-consuming-tasks-using-task-process-in-php-spool/”