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

2022-05-17 08:49:09 字數 2233 閱讀 5944

目錄swoole 啟動乙個服務,開啟了哪些程序和執行緒?

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

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

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

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

廢話不多說,直接看**吧。

serv.php

<?php 

class server

); $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 的文件:

看下這張圖:

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

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 文件:

task_worker_num 文件:

二、為什麼是 2 個 reactor 執行緒?它是幹什麼的?

因為,reactor 執行緒數,預設為 swoole_cpu_num,也可以通過 reactor_num 引數進行設定。

reactor_num 文件:

它是真正處理 tcp 連線,收發資料的執行緒。

reactor執行緒 文件:

三、reactor、worker、taskworker 的關係是什麼樣的?

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

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

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

docker 啟動乙個mysql服務

目錄 一 pull官方映象 二 檢視映象 三 執行容器 開啟mysql服務 四 如何登陸到客戶端 選擇乙個指定的版本,或者直接拉去最新的mysql版本。docker pull mysqldocker images docker images repository tag image id creat...

使用http server開啟乙個本地伺服器

在寫前端頁面中,經常會在瀏覽器執行html頁面,從本地資料夾中直接開啟的一般都是file協議,當 中存在http或https的鏈結時,html頁面就無法正常開啟,為了解決這種情況,需要在在本地開啟乙個本地的伺服器。本文是利用node.js中的http server,開啟本地服務,步驟如下 在終端輸入...

使用java啟動notepad開啟乙個文字檔案

老有人問,其實很簡單的,就一行 process p1 runtime.getruntime exec notepad d 1234.txt process p2 runtime.getruntime exec cmd c notepad d 1234.txt process p3 runtime.g...