资讯专栏INFORMATION COLUMN

Swoole 启动一个服务,开启了哪些进程和线程?

KunMinX / 3802人阅读

摘要:概述启动一个服务,开启了哪些进程和线程为了解决这个问题,咱们启动一个最简单的服务,一起看看究竟启动了哪些进程和线程然后结合官网运行流程图,对每个进程和线程进行归类。现在我们了解了,启动的这个服务使用了个进程个线程。

概述

Swoole 启动一个服务,开启了哪些进程和线程?

为了解决这个问题,咱们启动一个最简单的服务,一起看看究竟启动了哪些进程和线程?

然后结合官网运行流程图,对每个进程和线程进行归类。

服务启动后打印出当前 Swoole 版本 和 当前 CPU 核数。

打印 Swoole 版本,是让大家可以下载这个版本 去运行代码。

打印 CPU 核数,是因为这个参数下面会用到。

废话不多说,直接看代码吧。

代码

serv.php

serv = new swoole_server("0.0.0.0", 9502);
        $this->serv->set([
            "worker_num"      => 3,
            "task_worker_num" => 3,
        ]);
        $this->serv->on("Start", function ($serv) {
            echo "SWOOLE:".SWOOLE_VERSION . " 服务已启动".PHP_EOL;
            echo "SWOOLE_CPU_NUM:".swoole_cpu_num().PHP_EOL;
        });
        $this->serv->on("Receive", function ($serv, $fd, $from_id, $data) { });
        $this->serv->on("Task", function ($serv, $task) { });
        $this->serv->on("Finish", function ($serv, $task_id, $data) {});
        $this->serv->start();
    }
}
$server = new Server();

上面的代码简单说下,创建了一个 TCP 服务器,启动了 3 个 worker 进程, 3 个 task 进程,因为启用了 task 功能,所以必须注册 onTask、onFinish 2 个事件的回调函数。

咱们运行一下:

使用 ps 查看下:

16390 的父进程是 16389。

16393、16394、16395、16396、16397、16398 的父进程是 16390。

有没有发现,16391、16392 去哪啦?是不是很奇怪。

再用 pstree 查看下:

出来了吧,16391、16392 是线程 与 16390 进程一个层级。

现在我们了解了,启动的这个服务使用了 8 个进程、2 个线程。

我们一起看下官方 Swoole Server 的文档:

https://wiki.swoole.com/wiki/...

看下这张图:

通过上面的图,我们可以得到结论:

16389 是 Master 进程。

16390 是 Manager 进程。

16391、16392 是 Reactor 线程。

16393、16394、16395、16396、16397、16398 包括 3 个 Worker 进程,3 个 Task 进程。

小结

一、为什么是 3 个 Worker 进程、3 个 Task 进程?

因为,在创建服务的时候我们进行了设置 worker_num = 3, task_worker_num = 3。

worker_num 如果不进行设置,默认为 SWOOLE_CPU_NUM,在上面咱们打印出来了,默认为 2,最大不超过,SWOOLE_CPU_NUM * 1000,具体详情,看官方文档。

worker_num 文档:

https://wiki.swoole.com/wiki/...

task_worker_num 文档:

https://wiki.swoole.com/wiki/...

二、为什么是 2 个 Reactor 线程?它是干什么的?

因为,Reactor 线程数,默认为 SWOOLE_CPU_NUM,也可以通过 reactor_num 参数进行设置。

reactor_num 文档:

https://wiki.swoole.com/wiki/...

它是真正处理 TCP 连接,收发数据的线程。

Reactor线程 文档:

https://wiki.swoole.com/wiki/...

三、Reactor、Worker、TaskWorker 的关系是什么样的?

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

官方已经解释的很详细了,看官方文档吧:

https://wiki.swoole.com/wiki/...

如果你想入门学习 Swoole 可以看下这个 《Swoole 文章汇总(10 篇)》。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31772.html

相关文章

  • Swoole 源码分析——Server模块之Start

    摘要:是缓存区高水位线,达到了说明缓冲区即将满了创建线程函数用于将监控的存放于中向中添加监听的文件描述符等待所有的线程开启事件循环利用创建线程,线程启动函数是保存监听本函数将用于监听的存放到当中,并设置相应的属性 Server 的启动 在 server 启动之前,swoole 首先要调用 php_swoole_register_callback 将 PHP 的回调函数注册到 server...

    3fuyu 评论0 收藏0
  • Swoole笔记(五)

    摘要:超过此数量后,新进入的连接将被拒绝。表示连接最大允许空闲的时间。当出错时底层会认为是恶意连接,丢弃数据并强制关闭连接。在启动时自动将进程的写入到文件,在关闭时自动删除文件。 配置说明 $server->set(array( daemonize => true, log_file => /www/log/swoole.log, reactor_num => 2, ...

    zgbgx 评论0 收藏0
  • swoole进程结构

    摘要:管理进程会监视所有子进程的退出事件,当进程发生致命错误或者运行生命周期结束时,管理进程会回收此进程,并创建新的进程。换句话也就是说,对于进程的创建回收等操作全权有保姆进程进行管理。跟的交互请求到达实际上是与进程中的某个线程发生了连接。 showImg(https://segmentfault.com/img/bVbrhb2?w=600&h=360); 一、进程的基本知识 什么是进程,所...

    546669204 评论0 收藏0
  • think-swoole 3.0入门教程(thinkphp 6.0)

    摘要:前言即将迎来最新版本,针对目前越来越流行,也推出了最新的扩展安装由于目前没有稳定版本,所以只能安装开发板接下来安装,目前最新的稳定版本是配置安装结束可以根据自己的需求对配置信息进行修改。 前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0 安装 由于目前thinkphp 6.0没有稳定版本,所...

    Bamboy 评论0 收藏0
  • swoole——从入门到放弃(一)

    摘要:进程可以使用函数向进程投递新的任务。当前的进程在调用回调函数时会将进程状态切换为忙碌,这时将不再接收新的,当函数返回时会将进程状态切换为空闲然后继续接收新的。当进程投递的任务在中完成时,进程会通过方法将任务处理的结果发送给进程。 swoole——从入门到放弃(一) 一、swoole的源码包安装 下载swoole源码:git clone https://gitee.com/swoole...

    morgan 评论0 收藏0

发表评论

0条评论

KunMinX

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<