第5节、Swoole进程结构

1、Swoole的高效之一的原因在于进程结构模型也使其可以高效的处理业务

在这里插入图片描述

1、Master进程:主进程

这个是swoole的主进程,这个进程是用于处理swoole的核心事件驱动的,那么在这个进程当中可以看到它拥有一个MainReactor[线程]以及若干个Reactor[线程],swoole所有对于事件的监听都会在这些线程中实现,比如来自客户端的连接,信号处理等。
在这里插入图片描述

1.1、MainReactor(主线程)

主线程会负责监听server socket,如果有新的连接accept,主线程会评估每个Reactor线程的连接数量。将此连接分配给连接数最少的reactor线程,做一个负载均衡。

1.2 、Reactor线程组

Reactor线程负责维护客户端机器的TCP连接、处理网络IO、收发数据完全是异步非阻塞的模式。
swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。

1.3、心跳包检测线程(HeartbeatCheck)
   Swoole配置了心跳检测之后,心跳包线程会在固定时间内对所有之前在线的连接

发送检测数据包

1.4、UDP收包线程(UdpRecv)

接收并且处理客户端udp数据包

2、Manger进程:管理进程

Swoole想要实现最好的性能必须创建出多个工作进程帮助处理任务,但Worker进程就必须fork操作,但是fork操作是不安全的,如果没有管理会出现很多的僵尸进程,进而影响服务器性能,同时worker进程被误杀或者由于程序的原因会异常退出,为了保证服务的稳定性,需要重新创建worker进程。

Swoole在运行中会创建一个单独的管理进程,所有的worker进程和task进程都是从管理进程Fork出来的。管理进程会监视所有子进程的退出事件,当worker进程发生致命错误或者运行生命周期结束时,管理进程会回收此进程,并创建新的进程。换句话也就是说,对于worker、task进程的创建、回收等操作全权有“保姆”Manager进程进行管理。

在这里插入图片描述

2.1.swoole中worker/task进程都是由Manager进程Fork并管理的。
2.2.子进程结束运行时,manager进程负责回收此子进程,避免成为僵尸进程。并创建新的子进程
2.3.服务器关闭时,manager进程将发送信号给所有子进程,通知子进程关闭服务
2.4.服务器reload时,manager进程会逐个关闭/重启子进程

3、Worker进程:工作进程

worker 进程属于swoole的主逻辑进程,用户处理客户端的一系列请求,接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端可以是异步非阻塞模式,也可以是同步阻塞模式

3.1.接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据
3.2.生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端
3.3.可以是异步非阻塞模式,也可以是同步阻塞模式
3.4.Worker以多进程的方式运行

4、Task进程:异步任务工作进程

taskWorker进程这一进城是swoole提供的异步工作进程,这些进程主要用于处理一些耗时较长的同步任务,在worker进程当中投递过来。

4.1.接受由Worker进程通过swoole_server->task/taskwait方法投递的任务
4.2.处理任务,并将结果数据返回(swoole_server->finish)给Worker进程
4.3.完全是同步阻塞模式
4.4.TaskWorker以多进程的方式运行

2、Reactor、Worker、TaskWorker的关系:

可以理解为Reactor就是nginx,Worker就是php-fpm。Reactor线程异步并行地处理网络请求,然后再转发给Worker进程中去处理。Reactor和Worker间通过UnixSocket进行通信。

在php-fpm的应用中,经常会将一个任务异步投递到Redis等队列中,并在后台启动一些php进程异步地处理这些任务。Swoole提供的Worker是一套更完整的方案,将任务的投递、队列、php任务处理进程管理合为一体。通过底层提供的API可以非常简单地实现异步任务的处理。另外TaskWorker还可以在任务执行完成后,再返回一个结果反馈到Worker。

Swoole的Reactor、Worker、TaskWorker之间可以紧密的结合起来,提供更高级的使用方式。

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

底层会为Worker进程、TaskWorker进程分配一个唯一的ID
不同的Worker和TaskWorker进程之间可以通过sendMessage接口进行通信
在这里插入图片描述

3、查看进程

当启动一个Swoole应用时,一共会创建2 + n + m个进程,2为一个Master进程和一个Manager进程,其中n为Worker进程数。m为TaskWorker进程数。

至少有两个进程,主进程和管理进程。

在启动了server.php之后,在命令行查看当前产生的进程

pstree -ap  |  grep  server.php

猜你喜欢

转载自blog.csdn.net/qq_41417172/article/details/89310954
今日推荐