若转载教程,请注明出自SW-X框架官方文档

Swoole进程模型、第3层:工作进程

  1. 工作进程主要用于处理客户端请求
  2. 工作进程接收由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据。
  3. 工作进程生成响应数据并发送给Reactor线程,由Reactor线程发送给TCP客户端。
  4. 工作进程可以是异步非阻塞模式也可以是同步阻塞模式。
  5. 工作进程以多进程的方式运行

与传统的半同步半异步服务器不同是,Swoole的工作进程可以同步的也可以异步的。
这样带来了工作进程类似于PHP-FPM进程,它接收由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据。
工作线程生成响应数据并发送给Reactor线程,由Reactor线程发送给TCP客户端。工作线程可以是异步模式,也可以是同步模式。另外,工作线程以多进程的方式运行。
Swoole想要实现最好的性能就必须创建出多个工作进程帮助处理任务,但是工作进程必须fork操作,而fork操作又是不安全的。
如果没有管理将会出现很多僵尸进程,进而影响服务器性能。
同时工作进程被误杀或由于程序原因会引起异常退出,为了保证服务的稳定性,需要重新创建工作进程。
工作进程可分为两类:

  1. Worker进程是Swoole的主逻辑进程,用于处理来自客户端的请求。
  2. Task进程是Swoole提供的异步工作进程,用于处理耗时较长的同步任务。

Worker工作进程

Worker工作进程接收Reactor线程投递过来的数据,执行PHP代码,然后生成数据并交给Reactor线程,由Reactor线程通过TCP将数据返回给客户端。如果是UDP,Worker工作进程会直接将数据发送给客户端。
Worker进程中执行的PHP代码,它等同于PHP-FPM。
PHP-FPM在处理异步操作时是很无力的,但Swoole提供的Task进程可以很好的解决这个问题。
Worker进程可以将一些异步任务投递给Task进程,然后直接返回,处理其他由Reactor线程投递过来的事件。
Worker进程内的回调函数:

  1. onWorkerStart Worker工作进程或Task任务进程启动时触发
  2. onWorkerStop Worker进程终止时触发
  3. onConnect 当有新的连接进入时触发
  4. onClose TCP客户端连接关闭后触发
  5. onReceive 当接收到数据时触发
  6. onPacket 当接收到UDP数据包是时触发
  7. onFinish Worker工作进程投递的任务在task_worker中完成时,Task进程会通过finish()方法将任务处理的结果发送给Worker进程。
  8. onWorkerExit 当开启reload_async特性后有效,即异步重启特性。
  9. onPipeMessage 当工作进程收到由sendMessage发送的管道消息时触发

Task任务进程
  1. 异步工作进程
  2. 接收由Worker工作进程通过swoole_server->taskswoole_server->taskwait方法投递的任务。
  3. 处理任务,并将结果数据返回给Worker工作进程swoole_server->finish
  4. 同步阻塞模式
  5. 以多进程的方式运行

Swoolen除了Reactor线程,Task任务工作进程是以异步的方式处理其它任务的进程,使用方式类似于Gearman。
它接收由Worker进程通过swoole_server->task/taskwait方法投递的任务,然后处理任务,并将结果数据使用swoole_server->finish返回给Worker进程。
Task以多进程的方式进行运行。
简单来说,可以将Reactor理解为Nginx,将Worker理解为PHP-FPM。Reactor线程异步并行地处理网络请求,然后再转发给Worker工作进程中去处理(在回调函数中处理)。
Reactor和Worker之间通过UnixSocket进行通信。
Swoole除了Reactor线程,Worker工作进程还提供了Task进程池。
目的是为了解决业务代码中,有些逻辑部分不需要马上执行。
利用Task进程池,可以方便的投递一个异步任务区执行。
Task进程以完全同步阻塞的方式运行,一个Task进程在执行任务期间是不接受从Worker进程投递的任务的,当Task进程执行完任务后,会异步的通知Worker进程并告诉它任务已经完成。
Task进程内的回调函数:

  1. onTask Task线程内被调用,Worker进程可使用swoole_server_task函数向Task进程投递新的任务。
  2. onWorkerStart WorkerTask进程启动时触发
  3. onPipeMessage 当工作进程收到由sendMessage发送的管道消息时触发

image.png