Swoole中使用task进程异步的处理耗时任务
我们知道,swoole中有两大进程,分别是 master 主进程和 manager 管理进程。
其中 master 主进程中会有一个主 reactor 线程和多个 reactor 线程,主要的作用就是用来维护TCP连接,处理网络IO,收发数据。
而 manager 管理进程,作用则是 fork 和管理 worker 和 task 进程。
worker 进程的作用是接收 reactor 线程传递的数据,并处理数据,返回处理结果给 reactor 线程。
task 进程的作用是处理一些相对耗时的任务,task 与 worker 进程是独立的,不会影响 worker 进程处理客户端的请求。
一、task 进程的应用场景:
1、相对耗时的邮件群发,比如某某活动,需要给100W用户发送活动邮件。
2、推送某些大V的动态,比如某大V发了条新消息,粉丝需要及时获取到该动态。
二、worker 与 task 的相互关系:
1、worker 进程中能过调用 task() 来投递任务,task 进程中 通过 onTask 事件来响应投递来的任务。
2、task 进程中 通过 直接返回 或 调用 finish() 来告诉 worker 进程任务处理完毕,worker 进程中 通过 onFinish 事件响应任务完成。
三、使用 task 的前题:
1、在 Server 中 配置 task_worker_num 数量。
2、设置 Server 的 onTask 和 onFinish 事件回调函数。
四、简单的使用task进行累加和的计算例子
<?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) {
//注意这里,我们通过taskworker来判断是task进程还是worker进程
//需要在worker进程中调用task(),不然会报出警告
//这里会执行两遍,因为我们设置了worker_num数为2
if (!$server->taskworker) {
echo '投递任务开始...', PHP_EOL;
//投递32个累加计算任务给16个task进程
for ($ix = 0; $ix < 32; $ix++) {
//注意这里的投递是异步的
$server->task([mt_rand(1, 100), mt_rand(1000, 9999)]);
}
echo '投递任务结束...', PHP_EOL;
}
});
//server服务必须要有onReceive回调
$server->on('Receive', function ($server, $fd, $reactor_id, $data) {
});
//注意,task进程完全是同步阻塞模式的
$server->on('Task', function ($server, $task_id, $src_worker_id, $data) {
echo "task {$task_id} 进程正在工作...", PHP_EOL;
$start = $data[0];
$end = $data[1];
$total = 0;
for (; $start <= $end; $start++) {
$total += $start;
}
echo "task {$task_id} 进程完成工作...", PHP_EOL;
return $total;
});
$server->on('Finish', function ($server, $task_id, $data) {
echo "task {$task_id} 进程处理完成, 结果为 {$data}", PHP_EOL;
});
$server->start();
注意,我们通过调用 task() 往任务池中投递任务,swoole 底层会轮询的投递任务到各个 task 进程。
当你投递任务的数量超过 onTask 的处理速度,这会导致任务池被塞满,进而导致 worker 进程发生阻塞,所以需合理设置 task_worker_num 数量和处理速度之间的关系。
当然,我们也可以人为的把任务投递到指定的 task 进程。task() 函数的第二个参数可以指定要投递的 task 进程ID,ID范围为 0 到 (task_worker_num - 1)。
五、对任务进行切分,人为控制投递到 task 进程
<?php
$server = new swoole_server('0.0.0.0', 6666);
$server->set([
'worker_num' => 1,
'task_worker_num' => 10,
]);
$server->on('WorkerStart', function ($server, $worker_id) {
//为了方便演示,把worker_num设置为1,这里只会执行一次
if (!$server->taskworker) {
//通过swoole_table共享内存,在不同进程中共享数据
$server->result = new swoole_table(10240);
//用于保存task进程完成数量
$server->result->column('finish_nums', swoole_table::TYPE_INT);
//用于保存最终计算结果
$server->result->column('result', swoole_table::TYPE_INT);
$server->result->create();
//计算1000的累加和,并把计算任务分配到10个task进程上
$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) {
});
//注意,task进程完全是同步阻塞模式的
$server->on('Task', function ($server, $task_id, $src_worker_id, $data) {
echo "task {$task_id} 进程正在工作... 计算 {$data[0]} - {$data[1]} ", PHP_EOL;
$start = ++$data[0];
$end = $data[1];
$total = 0;
for (; $start <= $end; $start++) {
$total += $start;
}
echo "task {$task_id} 进程完成工作...", PHP_EOL;
return $total;
});
$server->on('Finish', function ($server, $task_id, $data) {
echo "task {$task_id} 进程处理完成, 结果为 {$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 "最终计算结果:{$server->result->get('result', 'result')}", PHP_EOL;
}
});
$server->start();
Приложение работает стабильно, без глюков и тормозов. Очень доволен
Очень нравится, что здесь есть ставки на экзотические виды спорта. Это добавляет разнообразия
Поддержка всегда быстро отвечает и решает любые вопросы. Это большой плюс
Ставлю на футбол, и Melbet предлагает просто огромный выбор лиг и турниров
Лайв-режим просто супер! Можно следить за матчем и ставить в реальном времени
Ни разу не было проблем с блокировками. Всегда можно зайти через официальное приложение
Ставлю на футбол, и Melbet предлагает просто огромный выбор лиг и турниров
Очень удобно, что можно ставить на виртуальный спорт. Это отличная альтернатива
Лайв-режим просто супер! Можно следить за матчем и ставить в реальном времени
Ставлю на киберспорт, и Melbet предлагает просто огромный выбор турниров. Очень круто!
Ставлю на хоккей, и Melbet предлагает отличные коэффициенты. Рекомендую!
Очень нравится, что здесь есть ставки на экзотические виды спорта. Это добавляет разнообразия
Приложение скачал быстро, всё работает без нареканий. Очень доволен
Fortunica’s welcome bonus is one of the best I’ve seen. 150% up to $1,000 is a steal!
The VIP rewards at Fortunica are next-level. Exclusive spins and cash bonuses keep me coming back.
The Sweet Bonanza slot at Fortunica is packed with bonuses. I’ve hit some big wins on it!
Игровые автоматы в Лев казино — суперграфика и большие выигрыши!
Не ожидал, что LED-экран так сильно улучшит восприятие информации — теперь даже сложные графики и таблицы воспринимаются легко
Казино Лев — это место, где каждый может выиграть!
Интерактивные панели оказались незаменимы для обучения новых сотрудников, можно сразу показывать и объяснять, не теряя времени на распечатки
Онлайн казино Лев — здесь всегда честные выплаты и большие выигрыши!
Интерактивные панели в конференц-зале помогли сделать обучение новых сотрудников более динамичным и эффективным
Мелбет слоты: лучшие игровые автоматы для азарта. Казино предлагает щедрые бонусы и разнообразие игр.
Мелбет казино скачать: наслаждайтесь слотами в любое время. Приложение гарантирует стабильность и безопасность.
Мелбет мобильная версия: делайте ставки в любом месте. Приложение обеспечивает быстрый доступ к играм.
Мелбет слоты: лучшие игровые автоматы для азарта. Казино предлагает щедрые бонусы и разнообразие игр.
Hondrolife a Torino – consegna in un giorno. Il dolore è sparito. Prezzo in offerta
Очень информативно и актуально для всех предприятий.
Nutriente B3 para tonificación en HondroLife. ¡Mis articulaciones lo aman!
Вече не се страхувам от студеното време, ставите ми са по-здрави
Лучше обратиться к проверенным специалистам, чтобы не нарваться на мошенников. Заказать прогон Хрумером дешево — не всегда значит эффективно.
Pieczenie podeszwy stóp? Exodermin pomaga od razu. Idealny dla aktywnych ludzi. Opinie są świetne
The Minotaurus token is a great medium of exchange within its world. It facilitates trade and commerce perfectly.
Exodermin czy Amorolfina? Exodermin jest łatwiejszy w użyciu. Grzybica zniknęła. Opinie są super
Зачервяване на краката изчезна след Exodermin. Кремът е лек и се абсорбира бързо. Мнения от БГ мама са вярни
Exodermin est un excellent produit. Ma mycose des pieds a disparu et ma peau va bien.
Exodermin hat mir bei meinem Fußpilz super geholfen. Die Anwendung ist kinderleicht!
Exodermin trató mi hongo en las uñas rápidamente. ¡Estoy muy satisfecho con el resultado!
The Minotaurus token is backed by a strong and growing reserve. This ensures its stability and value.
Puta en Valencia discreta en hoteles.
Подписчики в Инстаграм ценят личные истории
Рапорт о выплате за ранение — скачал, приложил медсправку, компенсацию дали быстро.
Minecraft Java форум — нашел гайд по экономике для сервера.
Вывод быстрый.
Вывод быстрый.
Минус: верификация обязательна, но это для безопасности.
Играю responsibly, устанавливаю лимиты — все ок.