swoole之进程模型的示例分析

  介绍

小编给大家分享一下swoole之进程模型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

初识服务器一文的时候我们说过,swoole是事件驱动的。在使用swoole的过程中,我们也体会到,swoole的使用非常简单,仅仅注册相应的回调处理我们的业务逻辑即可。

但是,在继续学习swoole之前,我们有必要再看一看swoole的运行流程和进程模型。

<>强推荐(免费):swoole

前面两篇文章我们已经对服务器和任务做了简单的介绍,后面再对服务器的创建以及脚本的执行,如无特殊说明均在CLI下执行,我就不啰嗦了。

现在,我们创建一个简单的服务器来分析一下,文件命名为服务器进程。php

 serv 美元;=,new  swoole_server (& # 39; 127.0.0.1 # 39;,, 9501);
  →美元服务集((
  ,,,& # 39;worker_num& # 39;,=祝辞,2,
  ,,,& # 39;task_worker_num& # 39;,=祝辞,1,
  ]);
  服务→美元(& # 39;连接# 39;,,function (算是美元,,fd美元),{
  });
  服务→美元(& # 39;接受# 39;,,function (算是美元,fd美元,fromId美元,美元数据),{
  });
  服务→美元(& # 39;关闭# 39;,,function (算是美元,,fd美元),{
  });
  服务→美元(& # 39;任务# 39;,,function (算是美元,taskId美元,fromId美元,美元数据),{
  });
  服务→美元(& # 39;完成# 39;,,function (算是美元,taskId美元,美元数据),{
  });
  
  服务→美元开始();

注意这里我们选择了两个工人进程个一个任务进程,那是不是就意味着创建这个服务器就是开启了3个进程呢?我们来看下

新开一个终端,我们用ps命令看下结果

,美元ps  aux  | grep 服务器进程   root ,,,, 21843,, xxx…, php  server-process.php   root ,,,, 21844,, xxx…, php  server-process.php   root ,,,, 21846,, xxx…, php  server-process.php   root ,,,, 21847,, xxx…, php  server-process.php   root ,,,, 21848,, xxx…, php  server-process.php   root     21854  xxx... grep --color=auto server-process

为了方便阅读,ps的结果中部分不重要数据已经被稍加处理了。

排除最后一个结果(最后一个是我们运行的ps命令)我们发现,竟然有多达5个相似的进程在运行,按照我们理解,不应该是3个吗,怎么多了两个呢?

还记得我们在进程/线程一文中说过的多进程的实现吗?我们说到多进程的实现一般会被设计Master-Worker模式,常见的nginx默认的多进程模式也正是如此,当然swoole默认的也是多进程模型。

相比Master-Worker模式,swoole的进程模型可以用Master-Manager-Worker来形容。即在Master-Worker的基础上又增加了一层Manager进程。这也就解答了我们开头抛出的问题为什么是5个进程而不是3个进程了。(1个Master进程+1个Manager进程+2个Worker进程+1个Task进程)

正所谓“存在即合理”,我们来看一下Master\Manager\Worker三种进程各自存在的原因。

Master进程是一个多线程程序。注解:按照我们之前的理解,多个线程是运行在单一进程的上下文中的,其实对于单一进程中的每一个线程,都有它自己的上下文,但是由于共同存在于同一进程,所以它们也共享这个进程,包括它的代码、数据等等。

再回来继续说Master进程,Master进程就是我们的主进程,掌管生杀大权,它挂了,那底下的都得玩完。Master进程,包括主线程,多个Reactor线程等。

每一个线程都有自己的用途,比如主线程用于Accept、信号处理等操作,而Reactor线程是处理tcp连接,处理网络IO,收发数据的线程。

说明两点:

  • 主线程的Accept操作,socket服务端经常用accept阻塞,上一节介绍socket编程的时候有一张配图,可以看看

  • 信号处理,信号就相当于一条消息,比如我们经常操作的Ctrl+C其实就是给Master进程的主线程发送一个SIGINT的信号,意思就是你可以终止啦,信号有很多种,后面还有介绍

通常,主线程处理完新的连接后,会将这个连接分配给固定的Reactor线程,并且这个Reactor线程会一直负责监听此socket(上文中后面对socket更新为socket即套接字,是用来与另一个进程进行跨网络通信的文件,文件可读可写),换句话就是说当此socket可读时,会读取数据,并将该请求分配给worker进程,这也就解释了我们在swoole初识讲解worker进程内的回调onReceive的第三个参数$fromId的含义;当此socket可写时,会把数据发送给tcp客户端。

swoole之进程模型的示例分析