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进行累加和的计算例子

  1. <?php
  2. $server = new swoole_server('0.0.0.0', 6666);
  3. $server->set([
  4. 'worker_num' => 2,
  5. 'task_worker_num' => 16,
  6. ]);
  7. $server->on('WorkerStart', function ($server, $worker_id) {
  8. //注意这里,我们通过taskworker来判断是task进程还是worker进程
  9. //需要在worker进程中调用task(),不然会报出警告
  10. //这里会执行两遍,因为我们设置了worker_num数为2
  11. if (!$server->taskworker) {
  12. echo '投递任务开始...', PHP_EOL;
  13. //投递32个累加计算任务给16个task进程
  14. for ($ix = 0; $ix < 32; $ix++) {
  15. //注意这里的投递是异步的
  16. $server->task([mt_rand(1, 100), mt_rand(1000, 9999)]);
  17. }
  18. echo '投递任务结束...', PHP_EOL;
  19. }
  20. });
  21. //server服务必须要有onReceive回调
  22. $server->on('Receive', function ($server, $fd, $reactor_id, $data) {
  23. });
  24. //注意,task进程完全是同步阻塞模式的
  25. $server->on('Task', function ($server, $task_id, $src_worker_id, $data) {
  26. echo "task {$task_id} 进程正在工作...", PHP_EOL;
  27. $start = $data[0];
  28. $end = $data[1];
  29. $total = 0;
  30. for (; $start <= $end; $start++) {
  31. $total += $start;
  32. }
  33. echo "task {$task_id} 进程完成工作...", PHP_EOL;
  34. return $total;
  35. });
  36. $server->on('Finish', function ($server, $task_id, $data) {
  37. echo "task {$task_id} 进程处理完成, 结果为 {$data}", PHP_EOL;
  38. });
  39. $server->start();

注意,我们通过调用 task() 往任务池中投递任务,swoole 底层会轮询的投递任务到各个 task 进程。

当你投递任务的数量超过 onTask 的处理速度,这会导致任务池被塞满,进而导致 worker 进程发生阻塞,所以需合理设置 task_worker_num 数量和处理速度之间的关系。

当然,我们也可以人为的把任务投递到指定的 task 进程。task() 函数的第二个参数可以指定要投递的 task 进程ID,ID范围为 0 到 (task_worker_num - 1)。

五、对任务进行切分,人为控制投递到 task 进程

  1. <?php
  2. $server = new swoole_server('0.0.0.0', 6666);
  3. $server->set([
  4. 'worker_num' => 1,
  5. 'task_worker_num' => 10,
  6. ]);
  7. $server->on('WorkerStart', function ($server, $worker_id) {
  8. //为了方便演示,把worker_num设置为1,这里只会执行一次
  9. if (!$server->taskworker) {
  10. //通过swoole_table共享内存,在不同进程中共享数据
  11. $server->result = new swoole_table(10240);
  12. //用于保存task进程完成数量
  13. $server->result->column('finish_nums', swoole_table::TYPE_INT);
  14. //用于保存最终计算结果
  15. $server->result->column('result', swoole_table::TYPE_INT);
  16. $server->result->create();
  17. //计算1000的累加和,并把计算任务分配到10个task进程上
  18. $num = 1000;
  19. $step = $num / $server->setting['task_worker_num'];
  20. for ($ix = 0; $ix < $server->setting['task_worker_num']; $ix++) {
  21. $start = $ix * $step;
  22. $server->task([$start, $start + $step], $ix);
  23. }
  24. }
  25. });
  26. $server->on('Receive', function ($server, $fd, $reactor_id, $data) {
  27. });
  28. //注意,task进程完全是同步阻塞模式的
  29. $server->on('Task', function ($server, $task_id, $src_worker_id, $data) {
  30. echo "task {$task_id} 进程正在工作... 计算 {$data[0]} - {$data[1]} ", PHP_EOL;
  31. $start = ++$data[0];
  32. $end = $data[1];
  33. $total = 0;
  34. for (; $start <= $end; $start++) {
  35. $total += $start;
  36. }
  37. echo "task {$task_id} 进程完成工作...", PHP_EOL;
  38. return $total;
  39. });
  40. $server->on('Finish', function ($server, $task_id, $data) {
  41. echo "task {$task_id} 进程处理完成, 结果为 {$data}", PHP_EOL;
  42. $server->result->incr('finish_nums', 'finish_nums');
  43. $server->result->set('result', ['result' => $data + $server->result->get('result', 'result')]);
  44. if ($server->result->get('finish_nums', 'finish_nums') == $server->setting['task_worker_num']) {
  45. echo "最终计算结果:{$server->result->get('result', 'result')}", PHP_EOL;
  46. }
  47. });
  48. $server->start();
点赞 ( 0 )

30 条评论

  1. wett tipps dfb Pokal

    beste wettanbieter ohne lugas

  2. Johnette

    buchmacher bonus ohne einzahlung

  3. nba basketball wetten

    sichere wett tipps

  4. Elyse

    stake 5 apuestas

  5. wettanbieter mit deutscher lizenz

    internet wetten live

  6. https://h117.dev34.Info/

    mejores casas de apuestas españolas

  7. Casa De Apuestas Argentina

    apuestas peru vs chile

  8. Рокс казино онлайн приятно удивило выбором провайдеров. Через rox casino зеркало получилось быстро восстановить доступ. Лагов во время игры не заметил.

  9. webpage

    Селектор казино приятно удивило удобным интерфейсом и быстрым запуском игр. Играю через selector casino онлайн без лагов, всё работает стабильно. Отличный вариант для вечернего отдыха.

  10. dragon

    Драгон мани рабочее зеркало выручает, когда основной сайт недоступен. Dragon money быстро загружается и не лагает. Можно спокойно продолжать игру.

  11. Нравится, что в казино атом онлайн можно играть в демо-режиме перед реальными ставками. Это помогает изучить новые игровые автоматы atom без риска для кошелька.

  12. entry visa for egypt

    I got this web site from my friend who informed me on the topic of this web site and now this time I am browsing this web site and reading very informative articles at this place.

  13. Apuestas Mundial Rugby

    bonos casas de apuestas sin depósito

  14. revive.atulenterprises.com

    como funcionan las apuestas sistema

  15. Skye

    casinos apuestas

  16. Криптобосс работает стабильно и без сбоев

  17. IDN SLOT

    Postingan ini sangat bermanfaat. Saya pribadi semakin mengerti soal pembahasan ini. Ngomong-ngomong, saya juga sempat mencari info tentang platform IDN SLOT. Terima kasih sudah berbagi konten yang bermanfaat.

  18. casino unlim

    Casino unlim порадовало поддержкой, ответили быстро и по делу

  19. https://wokerman.ru/

    Суши Курчатовский район — быстро и очень вкусно

  20. db bet зеркало

    Db-bet casino приятно удивило бонусами

  21. drip casino зеркало

    Drip casino отзывы часто упоминают быстрый вывод средств

  22. Cat casino официальный сайт один из самых удобных, что я пробовал

  23. Wonderful beat ! I wish to apprentice while you amend your web site, how can i subscribe for a blog site? The account aided me a acceptable deal. I had been a little bit acquainted of this your broadcast provided bright clear concept

  24. Hi to every one, for the reason that I am truly eager of reading this webpage's post to be updated daily. It consists of good information.

  25. kraken tor зеркало

    kraken login

  26. Сервис не замедляет соединение

  27. Служба применяет современные препараты, которые не вредят домашним питомцам.

  28. unlimited coins android

    It's actually very difficult in this active life to listen news on Television, thus I only use internet for that reason, and take the hottest information.

  29. VPN помогает защититься от слежки

  30. казино онлайн

    Видно, что авторы стараются собрать хорошие варианты для тех, кто ищет, где играть на деньги

发表评论

人生在世,错别字在所难免,无需纠正。

插入图片
s
返回顶部