Swoole 啟動一個服務,開啟了哪些程式和執行緒?

新亮筆記發表於2019-06-24

概述

Swoole 啟動一個服務,開啟了哪些程式和執行緒?

為了解決這個問題,我們們啟動一個最簡單的服務,一起看看究竟啟動了哪些程式和執行緒?

然後結合官網執行流程圖,對每個程式和執行緒進行歸類。

服務啟動後列印出當前 Swoole 版本 和 當前 CPU 核數。

列印 Swoole 版本,是讓大家可以下載這個版本 去執行程式碼。

列印 CPU 核數,是因為這個引數下面會用到。

廢話不多說,直接看程式碼吧。

程式碼

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 個事件的回撥函式。

我們們執行一下:

Swoole 啟動一個服務,開啟了哪些程式和執行緒?

使用 ps 檢視下:

Swoole 啟動一個服務,開啟了哪些程式和執行緒?

16390 的父程式是 16389。

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

有沒有發現,16391、16392 去哪啦?是不是很奇怪。

再用 pstree 檢視下:

Swoole 啟動一個服務,開啟了哪些程式和執行緒?

出來了吧,16391、16392 是執行緒 與 16390 程式一個層級。

現在我們瞭解了,啟動的這個服務使用了 8 個程式、2 個執行緒。

我們一起看下官方 Swoole Server 的文件:

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

看下這張圖:

Swoole 啟動一個服務,開啟了哪些程式和執行緒?

通過上面的圖,我們可以得到結論:

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

task_worker_num 文件:

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

二、為什麼是 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

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

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

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

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

如果你想學習 Swoole 可以看下這個 《Swoole 文章彙總(10 篇)》

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

相關文章