概述

Swoole 启动一个服务,开启了哪些进程和线程?

为了解决这个问题,咱们启动一个最简单的服务,一起看看究竟启动了哪些进程和线程?

然后结合官网运行流程图,对每个进程和线程进行归类。

服务启动后打印出当前 Swoole 版本 和 当前 CPU 核数。

打印 Swoole 版本,是让大家可以下载这个版本 去运行代码。

打印 CPU 核数,是因为这个参数下面会用到。

废话不多说,直接看代码吧。

代码

serv.php

  1. <?php
  2. class Server
  3. {
  4. private $serv;
  5. public function __construct() {
  6. $this->serv = new swoole_server("0.0.0.0", 9502);
  7. $this->serv->set([
  8. 'worker_num' => 3,
  9. 'task_worker_num' => 3,
  10. ]);
  11. $this->serv->on('Start', function ($serv) {
  12. echo "SWOOLE:".SWOOLE_VERSION . " 服务已启动".PHP_EOL;
  13. echo "SWOOLE_CPU_NUM:".swoole_cpu_num().PHP_EOL;
  14. });
  15. $this->serv->on('Receive', function ($serv, $fd, $from_id, $data) { });
  16. $this->serv->on('Task', function ($serv, $task) { });
  17. $this->serv->on('Finish', function ($serv, $task_id, $data) {});
  18. $this->serv->start();
  19. }
  20. }
  21. $server = new Server();

上面的代码简单说下,创建了一个 TCP 服务器,启动了 3 个 worker 进程, 3 个 task 进程,因为启用了 task 功能,所以必须注册 onTask、onFinish 2 个事件的回调函数。

咱们运行一下:

使用 ps 查看下:

16390 的父进程是 16389。

16393、16394、16395、16396、16397、16398 的父进程是 16390。

有没有发现,16391、16392 去哪啦?是不是很奇怪。

再用 pstree 查看下:

出来了吧,16391、16392 是线程 与 16390 进程一个层级。

现在我们了解了,启动的这个服务使用了 8 个进程、2 个线程。

我们一起看下官方 Swoole Server 的文档:

https://wiki.swoole.com/wiki/page/p-server.html

看下这张图:

通过上面的图,我们可以得到结论:

16389 是 Master 进程。

16390 是 Manager 进程。

16391、16392 是 Reactor 线程。

16393、16394、16395、16396、16397、16398 包括 3 个 Worker 进程,3 个 Task 进程。

小结

一、为什么是 3 个 Worker 进程、3 个 Task 进程?

因为,在创建服务的时候我们进行了设置 worker_num = 3, task_worker_num = 3。

worker_num 如果不进行设置,默认为 SWOOLE_CPU_NUM,在上面咱们打印出来了,默认为 2,最大不超过,SWOOLE_CPU_NUM * 1000,具体详情,看官方文档。

worker_num 文档:

https://wiki.swoole.com/wiki/page/275.html

task_worker_num 文档:

https://wiki.swoole.com/wiki/page/276.html

二、为什么是 2 个 Reactor 线程?它是干什么的?

因为,Reactor 线程数,默认为 SWOOLE_CPU_NUM,也可以通过 reactor_num 参数进行设置。

reactor_num 文档:

https://wiki.swoole.com/wiki/page/281.html

它是真正处理 TCP 连接,收发数据的线程。

Reactor线程 文档:

https://wiki.swoole.com/wiki/page/347.html

三、Reactor、Worker、TaskWorker 的关系是什么样的?

一个通俗的比喻,假设Server就是一个工厂,那Reactor就是销售,接受客户订单。而Worker就是工人,当销售接到订单后,Worker去工作生产出客户要的东西。而TaskWorker可以理解为行政人员,可以帮助Worker干些杂事,让Worker专心工作。

官方已经解释的很详细了,看官方文档吧:

https://wiki.swoole.com/wiki/page/163.html

如果你想学习 Swoole 可以看下这个 《Swoole 文章汇总(10 篇)》

本文欢迎转发,转发请注明作者和出处,谢谢!

Swoole 启动一个服务,开启了哪些进程和线程?的更多相关文章

  1. Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终

    1.重装后启动mysql服务,提示 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止. 2.查看mysql根目录下有一 计算机名.err 打开一看全是英文的错误提示: 3.根据其中的 ...

  2. Windows 无法启动MongoDB服务 错误1067:进程意外终止

    1:Windows 无法启动MongoDB服务 错误1067:进程意外终止 2:解决方法: 进入MongoDB安装目录\data\将此文件夹下的mongod.lock删除(网友提供解决方案,实验之后貌 ...

  3. 无法启动mysql服务 错误1067:进程意外中止

    这个错误在前些周遇到过,没有解决,直接粗暴的卸载重装了,自己用的是wampserver集成环境,重装的后果是mysql里面的一些已有的数据库就没有了,有点小悲剧,不过幸好都是一些测试用的数据库,后面直 ...

  4. Oracle服务无法启动,报:Windows无法启动OracleOraDb10g_home1TNSListener服务,错误 1067:进程意外终止。

    运行配置和移植工具中的Net Configuration Assistant,进行监听程序配置.删除配置,然后重新配置. 切记 一定是先删除配置,再重新配置,而不是新建配置. 或者 打开Net Man ...

  5. Linux启动一个服务后,服务的某个文件所在的目录下出现类似:systemd-private.xxxxxx的目录

    Linux的目录下面形如: [root@:vg_adn_tidbCkhsTest:172.31.17.203 /var/lib/mysql]#ll /tmp total drwxr root root ...

  6. php开启新的进程或者线程

    开启线程: $php_cli_path = '/usr/bin/php';$dir_path = dirname(__FILE__)."/".'CheckTaskState.she ...

  7. 无法启动MYSQL服务”1067 进程意外终止”解决的方法

    自己一開始依照百度经验里的方法——<MySQL下载安装.配置与使用(win7x64)>去安装和配置,可是到后面步骤总是出现1067代号的错误. 慢慢折腾去解决. 这里汇总各种导致mysql ...

  8. 无法启动MYSQL服务”1067 进程意外终止”解决的方法——汇总及终极方法

    自己一開始依照百度经验里的方法--<MySQL下载安装.配置与使用(win7x64)>去安装和配置,可是到后面步骤总是出现1067代号的错误. 慢慢折腾去解决. 这里汇总各种导致mysql ...

  9. 在本地计算机无法启动MYSQL服务错误1067进程意外终止

    在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了, 你可以删除系统目录下的my.ini文件, 把下面的内容重新写入my.ini文件试试, 要适当地改 ...

随机推荐

  1. prototype原型

    1.prototype是函数的一个属性,并且是函数的原型对象.引用它的必然是函数[对象都是通过函数创建的], 这个prototype的属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做co ...

  2. spring+activemq实战之配置监听多队列实现不同队列消息消费

    摘选:https://my.oschina.net/u/3613230/blog/1457227 摘要: 最近在项目开发中,需要用到activemq,用的时候,发现在同一个项目中point-to-po ...

  3. css重点知识和bug解决方法

    1.图片向下撑大3像素问题 在一个盒子里面放一张图片,默认情况下,图片会向下撑大3像素,有以下几种解决方法: 1.1 给图片添加display:block: 1.2 给图片添加 float:left: ...

  4. ETL子系统

    最近在看<Pentaho Kettle 解决方案>,看到 ETL子系统,发现信息量比较大,用简短的语句做一下笔记. ETL子系统有34种子系统,被分成4个部分:抽取.清洗和更正.发布.管理 ...

  5. 开源框架 openFrameworks

    转自:https://www.cnblogs.com/lidabo/p/9134174.html 此处仅供学习,版权属原作者: 作为一个图形图像方向的研究生,我经常都在和 OpenGL .OpenCV ...

  6. Linux下修改MySQL数据库数据文件路径

    使用rpm安装方式安装完MySQL数据库后,数据文件的默认路径为/var/lib/mysql,然而根目录并不适合用于存储数据文件. 原路径:/var/lib/mysql 目标路径:/home/mysq ...

  7. 配置Servlet 容器

    SpringBoot默认使用Tomcat作为嵌入式的Servlet容器: 1.如何定制和修改Servlet容器的相关配置: 1.修改和server有关的配置(ServerProperties[也是Em ...

  8. [洛谷P1967][题解]货车运输

    题目 这道题让我们求最小限重的最大值 显然可以先求出最大生成树,然后在树上进行操作 因为如果两点之间有多条路径的话一定会走最大的,而其他小的路径是不会被走的 然后考虑求最小权值 可以采用倍增求LCA, ...

  9. Unity 依赖注入容器的AOP扩展

    使用EntLib\PIAB Unity 实现动态代理 using System; using Unity; using Unity.Interception; using Unity.Intercep ...

  10. WordPress 文件下载漏洞

    Google dork:inurl:"/wp-content/themes/liberator/inc/php/download.php" exploit:https://www. ...