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

概述

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

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

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

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

打印 Swoole 版本,是让你们能够下载这个版本 去运行代码。swoole

打印 CPU 核数,是由于这个参数下面会用到。函数

废话很少说,直接看代码吧。学习

代码

serv.phpthis

<?php

class Server
{
    private $serv;

    public function __construct() {
        $this->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 个事件的回调函数。spa

我们运行一下:线程

clipboard.png

使用 ps 查看下:

clipboard.png

16390 的父进程是 16389。

1639三、1639四、1639五、1639六、1639七、16398 的父进程是 16390。

有没有发现,1639一、16392 去哪啦?是否是很奇怪。

再用 pstree 查看下:

clipboard.png

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

如今咱们了解了,启动的这个服务使用了 8 个进程、2 个线程。

咱们一块儿看下官方 Swoole Server 的文档:

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

看下这张图:

clipboard.png

经过上面的图,咱们能够获得结论:

16389 是 Master 进程。

16390 是 Manager 进程。

1639一、16392 是 Reactor 线程。

1639三、1639四、1639五、1639六、1639七、16398 包括 3 个 Worker 进程,3 个 Task 进程。

小结

1、为何是 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、为何是 2 个 Reactor 线程?它是干什么的?

由于,Reactor 线程数,默认为 SWOOLE_CPU_NUM,也能够经过 reactor_num 参数进行设置。

reactor_num 文档:

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

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

Reactor线程 文档:

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

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

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

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

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

若是你想入门学习 Swoole 能够看下这个 《Swoole 文章汇总(10 篇)》

clipboard.png

相关文章
相关标签/搜索