Swoole 啓動一個服務,開啓了哪些進程和線程?

目錄php

概述

Swoole 啓動一個服務,開啓了哪些進程和線程?html

爲了解決這個問題,我們啓動一個最簡單的服務,一塊兒看看究竟啓動了哪些進程和線程?react

而後結合官網運行流程圖,對每一個進程和線程進行歸類。服務器

服務啓動後打印出當前 Swoole 版本 和 當前 CPU 核數。swoole

打印 Swoole 版本,是讓你們能夠下載這個版本 去運行代碼。函數

打印 CPU 核數,是由於這個參數下面會用到。學習

廢話很少說,直接看代碼吧。this

代碼

serv.php線程

<?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 個事件的回調函數。3d

我們運行一下:

使用 ps 查看下:

16390 的父進程是 16389。

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

有沒有發現,1639一、16392 去哪啦?是否是很奇怪。

再用 pstree 查看下:

出來了吧,1639一、16392 是線程 與 16390 進程一個層級。

如今咱們瞭解了,啓動的這個服務使用了 8 個進程、2 個線程。

咱們一塊兒看下官方 Swoole Server 的文檔:

https://wiki.swoole.com/wiki/page/p-server.html

看下這張圖:

經過上面的圖,咱們能夠獲得結論:

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/page/275.html

task_worker_num 文檔:

https://wiki.swoole.com/wiki/page/276.html

2、爲何是 2 個 Reactor 線程?它是幹什麼的?

由於,Reactor 線程數,默認爲 SWOOLE_CPU_NUM,也能夠經過 reactor_num 參數進行設置。

reactor_num 文檔:

https://wiki.swoole.com/wiki/page/281.html

它是真正處理 TCP 鏈接,收發數據的線程。

Reactor線程 文檔:

https://wiki.swoole.com/wiki/page/347.html

3、Reactor、Worker、TaskWorker 的關係是什麼樣的?

一個通俗的比喻,假設Server就是一個工廠,那Reactor就是銷售,接受客戶訂單。而Worker就是工人,當銷售接到訂單後,Worker去工做生產出客戶要的東西。而TaskWorker能夠理解爲行政人員,能夠幫助Worker幹些瑣事,讓Worker專心工做。

官方已經解釋的很詳細了,看官方文檔吧:

https://wiki.swoole.com/wiki/page/163.html

若是你想學習 Swoole 能夠看下這個 《Swoole 文章彙總(10 篇)》

本文歡迎轉發,轉發請註明做者和出處,謝謝!

相關文章
相關標籤/搜索