四:Swoole的进程结构

(1):Master进程
这个是swoole的主进程,这个进程是用于处理swoole的核心驱动的;然后由该进程 fork 出 Reactor 线程和 Manager 进程,那么在这个进程当中可以看到它拥有一个MainReactor[线程]以及若干个Reactor[线程],swoole所有对于事件的监听都会在这些线程中实现,比如来自客户端的连接,信号处理等。

一: MainReactor(主线程)
1):主线程会负责监听server socket,如果有新的连接accept;
2):主线程会评估每个Reactor线程的连接数量;
3):将此连接分配给连接数最少的reactor线程,做一个负载均衡;
Reactor线程组
1):Reactor线程负责维护客户端机器的TCP连接,处理网络I/O,收发数据;
2):完全是异步非阻塞模式;
3):swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程;
4):在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程,在socket可写时,将数据发送给TCP客户端;
心跳包检测线程
1):Swoole配置了心跳检测之后,心跳包线程会在固定时间内对所有之前在线的连接发送检测数据包;
Udp收包线程
1):接收并且处理客户端udp数据包
二:Manager进程(管理进程)
Swoole在运行中会创建一个单独的管理进程,所有的worker进程和task进程都是从管理进程Fork出来的;
管理进程会监视所有子进程的退出事件;当worker进程发生致命错误或者运行周期结束时,管理进程会回收此进程,并创建新的进程,以保持Worker进程总数不变;
换句话说对于worker,task进程的创建,回收等操作全权由保姆Manager进程进行管理;

三:Worker进程
它是以多进程的方式运行,所有请求的处理逻辑都是在 Worker 进程中完成,这是我们编写业务代码时真正要关心的部分。
接收由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据生成相应数据并发给Reactor线程.由Reactor线程发送给TCP客户端,
可以是异步非阻塞模式,也可以是同步阻塞模式;
四:Task进程 (异步任务工作进程)
和 Worker 进程类似,同样以多进程方式运行,但仅用于任务分发,当 Worker 进程将任务异步分发到任务队列时,Task Worker 负责从队列中消费这些任务(同步阻塞方式处理),处理完成后将结果返回给 Worker 进程;
当启动一个Swoole应用时,一共会创建2 + n + m个进程,2为一个Master进程和一个Manager进程,其中n为Worker进程数。m为TaskWorker进程数。
默认如果不设置,swoole底层会根据当前机器有多少CPU核数,启动对应数量的Reactor线程和Worker进程;
如下图:

在启动了server之后,在命令行执行ps -ajft|grep server.php查看当前产生的进程
所以现在默认我启动了1个Master进程,1个Manager进程,和4个worker进程,TaskWorker没有设置也就是为0,当前server会产生6个进程。

swoole事件处理流程

swoole使用的是reactor事件处理模式,一个请求经历的步骤如下:
1 服务器主线程等待客户端连接。
2 Reactor线程处理接连socket,读取socket上的请求数据(Receive),将请求封装好后投递给work进程。
3 Work进程就是逻辑单元,处理业务数据。
4 Work进程结果返回给Reactor线程。
5 Reactor线程将结果写回socket(Send)。

浙公网安备 33010602011771号