Автор оригинала: 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/”