swoole 进程模型分析 - 编程思维

在这边文章中我们将介绍以下内容:

1、Swoole Server 的运行模式

2、Swoole 进程模型分析

上图是 Swoole 官网提供的各个进程相互关系图,可以说理解了这张图,你就理解了 Swoole 的进程模型。

1、Swoole Server 的运行模式

Swoole 服务常见的运行模式有单线程模式和进程模式两种,两种方式介绍如下:

单线程模式 (SWOOLE_BASE) 这种模式就是传统的异步非阻塞 Server,与 Nginx 和 Node.js 等异步服务的原理是一样的。在这种模式下,事件循环会直接回调 PHP 的函数,而不是通过线程 dispatch 投递任务。如果在回调函数中有阻塞操作,就会导致 Server 退化为同步模式。就像在上一篇文章中 Nginx+PHP-FPM 架构中介绍的那样,Nginx 只做转发,具体业务由 PHP-FPM 来实现。假如 Nginx 也可以处理业务逻辑,一旦出现阻塞的业务逻辑,Nginx 的性能会急剧下降。正是因为 Nginx 和 PHP-FPM 所起到的作用不同,才会造就 Nginx 的高性能。Base 模式的特点:没有 Master 进程的角色;每个 Worker 进程同时承担了 Process 模式下 Reactor 线程和 Worker 进程两部分职责;在这种模式下,Manage 进程是可选的,当设置了 worker_num=1,并且么有使用 Task 和 MaxRequest 特性时,底层将直接创建一个单独的 Worker 进程,不创建 Manager 进程 Base 模式的优点:没有 IPC 开销,性能更好;代码简单,不容易出错。Base 模式的缺点:TCP 连接时在 Worker 进程中维持的,所以当某个 Worker 进程挂掉时,此 Worker 内的所有连接都将被关闭;少量 TCP 长连接无法利用到所有的 Worker 进程;TCP 连接与 Worker 进程是绑定的,在长连接应用中,不同的 Worker 进程无法实现负载均衡。例如:某些连接的数据量很大,这些连接所在的 Worker 进程的负载会非常高。但是某些连接数据量很小,所在 Worker 进程的负载会非常低。Base 模式适用场景:如果客户端连接之间不需要交互,可以使用 Base 模式。如 Memcache、Http 服务等。

进程模式 (SWOOLE_PROCESS) 多进程模式比较底层实现比较复杂,用了大量进程间通信、进程管理机制。适合业务逻辑非常复杂的场景。Swoole 提供了完善的进程管理、内存保护机制。在业务逻辑非常复杂的情况下,也可以长期稳定运行。

2、Swoole 进程模型

从上图中可以看出,Swoole 在启动后会创建 Master 进程和 Manager 进程。Master 进程会创建 Master 线程、Reactor 线程、心跳检测线程等,Manager 进程会创建 Worker 进程和 Task 进程。

Swoole 的线程和进程之间分别有什么作用呢?

Master 进程这个进程是 swoole 的核心进程,也是一个多线程的进程,一个 Master 线程和多个 Reactor 进程,Reactor 线程的数量可以配置。

Master 线程 Master 线程用于 accept 新的连接,然后会评估每个 Reactor 线程维护的连接数,最后将这个新的连接分配给连接数量最少的那个 Reactor 线程,从而保证每个 Reactor 线程的负载量是均衡的。Master 线程还负责对所有信号的接管(包括请求处理、重启进程、重载配置等),避免 Reactor 线程收到信号的打扰中断。

Reactor 线程当一个 socket 可读或可写的时候,就由 Reactor 线程将事件转发给 worker 进程。

Manager 进程 Manager 进程管理着 Worker 进程和 Task 进程,Worker 进程和 Task 进程是由 Manager 进程 fork 出来的。Manager 进程会监管 Worker 进程和 Task 进程的状态,当他们意外挂掉时,Manager 进程会重新拉起新的进程,Manager 进程还负责 Worker 进程和 Task 进程的平滑重启。

Worker 进程 Worker 进程是由 Manager 进程 fork 而来,用于处理具体的业务逻辑。Worker 进程可以用同步的方式去干活,也可以用异步的方式去干活。

Task 进程 Task 进程是一种特殊的 Worker 进程,专门用于处理一些比较耗时的操作。Task 进程只能工作在同步的方式下,不能使用异步。所以 Task 进程中不能使用定时器,而 Worker 进程可以。

以上就是本文的全部内容,如有错误,请指正!可以相互关注,方便一起交流技术心得。

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://segmentfault.com/a/1190000042528718

工资太低,想转行学什么就业前景好? - 编程思维

转行学什么就业前景好?我知道,肯定很多刚毕业的同学都遇到过这个问题,都感到特别的迷茫,不知道以后的路该怎么走。每个人都渴望一份有着高工资、福利好、工作环境好、社会地位高。老话说得好,女怕嫁错郎,男怕入错行。如果你选择了错误的行业,你将很难在多年的努力中取得巨大的成就,甚至随着行业衰败,选对了行业,即使你不太努力,你也可

crmeb 知识付费系统源码开发规范 - 编程思维

crmeb3.0遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:目录和文件目录使用小写+下划线;类库、函数文件统一以.php为后缀;类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;类文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名;类名和类文件名保持一致,统一采用驼

crmeb 多商户二开新增一个模板消息 - 编程思维

使用过程中,可能会需要增加一些微信的模板消息来实现功能,这里就具体的将整个流程演示一遍。首先登录个人的微信后台:https://mp.weixin.qq.com/,然后申请一个自己需要的消息模板,我这里以《访客接待消息通知》为例,下图是我申请好的截图。将刚才申请的模板信息填写到平台后台的模板管理中去,如下图代码实现部分

php+go 开发仿简书,实战高并发高可用微服务架构无密分享 - 编程思维

download:PHP+Go 开发仿简书,实战高并发高可用微服务架构Go(或Golang)语言起源于2007年,2009年正式发布。Go是一门非常年轻的语言,它的主要目标是“将Python等动态语言的开发速度与C/C++等编译语言的性能和安全性结合起来”。Go语言是编程语言设计的又一次尝试,是对类C语言的重大改进。它

go 代码风格没人喜欢?不对,gofmt 是所有人的最爱... - 编程思维

大家好,我是煎鱼。在任何语言进行编程开发时,只要涉及到多人协作。就一定会遇到一个旷世斗争的大问题。那就是:编码风格。Go 的,PHP 的,Java 的,C++ 的;初级、中级、高级、管理的风格;传统的、互联网的又都不一样。谁的风格更好例如经典的判断场景:if err != nil ,至少可以写出三种模式。如下代码:#

tp6+swoole4 反向代理配置 - 编程思维

Nginx反向代理配置首先配置反向代理前已经要把之前配置过的伪静态删除掉,不然保存的时候报错以下是反向代理的完整配置,请注意其中的端口号[8000]当前这个端口号就是config\swoole.php文件中的server.port配置中的端口号location ~* .(php|jsp|cgi|asp|aspx)${

swoole 启动一个服务,开启了哪些进程和线程?_新亮笔记-编程思维

目录概述代码小结 概述 Swoole 启动一个服务,开启了哪些进程和线程? 为了解决这个问题,咱们启动一个最简单的服务,一起看看究竟启动了哪些进程和线程? 然后结合官网运行流程图,对每个进程和线程进行归类。 服务启动后打印出当前 Swoole 版本 和 当前 CPU 核数。 打印 Swoole 版本,是让大家可以下载这

swoole http 的应用_新亮笔记-编程思维

目录概述代码小结扩展 概述 这是关于 Swoole 学习的第四篇文章:Swoole HTTP 的应用。 第三篇:Swoole WebSocket 的应用 第二篇:Swoole Task 的应用 第一篇:Swoole Timer 的应用 我们都知道 HTTP 是一种协议,允许 WEB 服务器和浏览器通过互联网进行发送

定时器 - 编程思维

本节将讲述如下三个问题:PHP 本身的定时器介绍 Swoole 中定时器的使用方法 Swoole 定时器的底层原理1、PHP 本身的定时器介绍先说说原生 PHP 如何实现定时器,PHP 的定时器是通过 pcntl_alarm 实现的:pcntl_alarm ( int $seconds ) : intpcntl_ala