Swoole 启动一个服务,开启了哪些进程和线程?
概述
Swoole 启动一个服务,开启了哪些进程和线程?
为了解决这个问题,咱们启动一个最简单的服务,一起看看究竟启动了哪些进程和线程?
然后结合官网运行流程图,对每个进程和线程进行归类。
服务启动后打印出当前 Swoole 版本 和 当前 CPU 核数。
打印 Swoole 版本,是让大家可以下载这个版本 去运行代码。
打印 CPU 核数,是因为这个参数下面会用到。
废话不多说,直接看代码吧。
代码
serv.php
<?php
class Server
{
private $serv;
public function __construct() {
$this->serv = new swoole_server("0.0.0.0", 9502);
$this->serv->set([
'worker_num' => 3,
'task_worker_num' => 3,
]);
$this->serv->on('Start', function ($serv) {
echo "SWOOLE:".SWOOLE_VERSION . " 服务已启动".PHP_EOL;
echo "SWOOLE_CPU_NUM:".swoole_cpu_num().PHP_EOL;
});
$this->serv->on('Receive', function ($serv, $fd, $from_id, $data) { });
$this->serv->on('Task', function ($serv, $task) { });
$this->serv->on('Finish', function ($serv, $task_id, $data) {});
$this->serv->start();
}
}
$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 启动一个服务,开启了哪些进程和线程?的更多相关文章
- Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终
1.重装后启动mysql服务,提示 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止. 2.查看mysql根目录下有一 计算机名.err 打开一看全是英文的错误提示: 3.根据其中的 ...
- Windows 无法启动MongoDB服务 错误1067:进程意外终止
1:Windows 无法启动MongoDB服务 错误1067:进程意外终止 2:解决方法: 进入MongoDB安装目录\data\将此文件夹下的mongod.lock删除(网友提供解决方案,实验之后貌 ...
- 无法启动mysql服务 错误1067:进程意外中止
这个错误在前些周遇到过,没有解决,直接粗暴的卸载重装了,自己用的是wampserver集成环境,重装的后果是mysql里面的一些已有的数据库就没有了,有点小悲剧,不过幸好都是一些测试用的数据库,后面直 ...
- Oracle服务无法启动,报:Windows无法启动OracleOraDb10g_home1TNSListener服务,错误 1067:进程意外终止。
运行配置和移植工具中的Net Configuration Assistant,进行监听程序配置.删除配置,然后重新配置. 切记 一定是先删除配置,再重新配置,而不是新建配置. 或者 打开Net Man ...
- Linux启动一个服务后,服务的某个文件所在的目录下出现类似:systemd-private.xxxxxx的目录
Linux的目录下面形如: [root@:vg_adn_tidbCkhsTest:172.31.17.203 /var/lib/mysql]#ll /tmp total drwxr root root ...
- php开启新的进程或者线程
开启线程: $php_cli_path = '/usr/bin/php';$dir_path = dirname(__FILE__)."/".'CheckTaskState.she ...
- 无法启动MYSQL服务”1067 进程意外终止”解决的方法
自己一開始依照百度经验里的方法——<MySQL下载安装.配置与使用(win7x64)>去安装和配置,可是到后面步骤总是出现1067代号的错误. 慢慢折腾去解决. 这里汇总各种导致mysql ...
- 无法启动MYSQL服务”1067 进程意外终止”解决的方法——汇总及终极方法
自己一開始依照百度经验里的方法--<MySQL下载安装.配置与使用(win7x64)>去安装和配置,可是到后面步骤总是出现1067代号的错误. 慢慢折腾去解决. 这里汇总各种导致mysql ...
- 在本地计算机无法启动MYSQL服务错误1067进程意外终止
在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了, 你可以删除系统目录下的my.ini文件, 把下面的内容重新写入my.ini文件试试, 要适当地改 ...
随机推荐
- HPS端的GPIO如何控制
该笔记主要记录HPS端的GPIO如何控制,包括控制LED和Key 1.GPIO地址映射 Peripheral Base Address 0xf000_0000 64M 2.HPS外设 (1)GPIO ...
- hexo + next 搭建博客时Cannot GET /tags/问题处理
原来是要修改新建的index.md文件,不仔细. 此外,愈发觉得百度和谷歌搜索同一问题的差距,谷歌更适合程序员! https://www.zhihu.com/question/29017171 这个可 ...
- 记mysql条件分支语句CASE WHEN THEN ELSE END的使用
记一次基于mysql数据库查询时条件分支语句使用 表达式格式:CASE column WHEN 条件1 THEN 表达式1 WHEN 条件2 THEN 表达式2 .... ELSE 表达式 END [ ...
- 6、UnityConfig实现AOP
需求:我们需要给已经开发好的服务如这里的UserService,添加额外的执行逻辑,但是又不想破坏原有的服务,如:我们需要给UserService添加监控逻辑,监控的目的是看UserService服务 ...
- Pytorch 记录
BCELoss BCEWithLogitsLoss 将sigmoid和BCELoss结合在一起,数据的稳定性更好. torch.nn.functional: binary_cross_entropy_ ...
- Leetcode题解 - DFS部分简单题目代码+思路(113、114、116、117、1020、494、576、688)
这次接触到记忆化DFS,不过还需要多加练习 113. 路径总和 II - (根到叶子结点相关信息记录) """ 思路: 本题 = 根到叶子结点的路径记录 + 根到叶子结点 ...
- Java之封装与访问权限控制(一)
目录 Java之封装与访问权限控制(一) 封装的概念 访问控制符 属性私有化 Java之封装与访问权限控制(一) 对于封装的概念,我总觉得自己还是挺了解的,但是真要我说,还真说不出个啥来.我只能默默地 ...
- JQuery之Ajax基础
众所周知JQuery中的Ajax主要用于数据传输,其数据传输格式为JSON格式数据,比XML格式数据传输更快. ajax 是 Asynchronous JavaScript and XML的简写,aj ...
- opengl画不出直线 线段 坐标轴 却能画出其他图形的坑
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12054507.html 好多次都是画坐标轴的三条直线画不出来,虽然最后都解决了 但是还是耽误 ...
- 设计模式之单例模式(Java)
单例模式 问题 多线程操作同一对象保证对象的一致性 解决思路 只有一次实例化过程,产生一个实例化对象,并提供返回该对象的方法. 单例模式的分类 1 饿汉式 在加载类的时候就产生实例对象 public ...