分享

Swoole的进程模型

 好好学戏 2019-08-09
在《计算机组成原理》中我们都学过,并发中最迫切需要解决的问题之一,就是数据的可靠性问题,防止脏读脏写。

一、linux查看进程

pstree命令可以查看进程的树模型

> php swoole_server_demo.php
> pstree -ap|grep swoole_server_demo
  |-php,2829 swoole_server_demo.php
  |   |-php,2831 swoole_server_demo.php
  |   |   `-php,2836 swoole_server_demo.php
  • 1

  • 2

  • 3

  • 4

  • 5

从系统的输出中,可以看出server其实有3个进程,进程的pid分别是2829、2831、2836,其中2829是2831的父进程,而2831又是2836的父进程。
2829是根进程,就是所谓的Master进程;而2831则是Manager进程;最后的2836是Worker进程。

二、各进程之间的关系

数量上:一个多进程模式下的Swoole Server中,有且只有一个Master进程;有且只有一个Manager进程;却可以有n个Worker进程。

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

Master、Manage、Worker、Task四种进程之间是怎么协作的:
1、Client主动Connect的时候,Client实际上是与Master进程中的某个Reactor线程发生了连接。
2、当TCP的三次握手成功了以后,由这个Reactor线程将连接成功的消息告诉Manager进程,再由Manager进程转交给Worker进程。
3、在这个Worker进程中触发了OnConnect的方法。
4、当Client向Server发送了一个数据包的时候,首先收到数据包的是Reactor线程,同时Reactor线程会完成组包,再将组好的包交给Manager进程,由Manager进程转交给Worker。
5、此时Worker进程触发OnReceive事件。
6、如果在Worker进程中做了什么处理,然后再用Send方法将数据发回给客户端时,数据则会沿着这个路径逆流而上。
7、Task进程主要处理一些占用时间较长的业务,主要处理Worker进程中占时较长的一些任务。
注:Task进程理解

形象的例子:
Master进程就像业务窗口的,Reactor就是前台接待员,用户很多的时候,后边的用户就需要排队等待服务;Reactor负责与客户直接沟通,对客户的请求进行初步的整理(传输层级别的整理——组包);然后,Manager进程就是类似项目经理的角色,要负责将业务分配给合适的Worker(例如空闲的Worker);而Worker进程就是工人,负责实现具体的业务。

三、多进程的基本配置

<?php
$server->set([
    "daemonize"=>true,
    "reactor_num"=>2,
    "worker_num"=>4,
]);

$server -> start();
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

reactor_num:表示Master进程中,Reactor线程总共开多少个,注意,这个可不是越多越好,因为计算机的CPU是有限的,所以一般设置为与CPU核心数量相同,或者四倍即可。
worker_num:表示启动多少个Worker进程,同样,Worker进程数量不是越多越好,仍然设置为与CPU核心数量相同,或者两倍即可。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多