摘要:概述啟動一個服務,開啟了哪些進程和線程為了解決這個問題,咱們啟動一個最簡單的服務,一起看看究竟啟動了哪些進程和線程然后結合官網運行流程圖,對每個進程和線程進行歸類。現在我們了解了,啟動的這個服務使用了個進程個線程。
概述
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 篇)》。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31772.html
摘要:是緩存區高水位線,達到了說明緩沖區即將滿了創建線程函數用于將監控的存放于中向中添加監聽的文件描述符等待所有的線程開啟事件循環利用創建線程,線程啟動函數是保存監聽本函數將用于監聽的存放到當中,并設置相應的屬性 Server 的啟動 在 server 啟動之前,swoole 首先要調用 php_swoole_register_callback 將 PHP 的回調函數注冊到 server...
摘要:超過此數量后,新進入的連接將被拒絕。表示連接最大允許空閑的時間。當出錯時底層會認為是惡意連接,丟棄數據并強制關閉連接。在啟動時自動將進程的寫入到文件,在關閉時自動刪除文件。 配置說明 $server->set(array( daemonize => true, log_file => /www/log/swoole.log, reactor_num => 2, ...
摘要:管理進程會監視所有子進程的退出事件,當進程發生致命錯誤或者運行生命周期結束時,管理進程會回收此進程,并創建新的進程。換句話也就是說,對于進程的創建回收等操作全權有保姆進程進行管理。跟的交互請求到達實際上是與進程中的某個線程發生了連接。 showImg(https://segmentfault.com/img/bVbrhb2?w=600&h=360); 一、進程的基本知識 什么是進程,所...
摘要:前言即將迎來最新版本,針對目前越來越流行,也推出了最新的擴展安裝由于目前沒有穩定版本,所以只能安裝開發板接下來安裝,目前最新的穩定版本是配置安裝結束可以根據自己的需求對配置信息進行修改。 前言 ThinkPHP即將迎來最新版本6.0,針對目前越來越流行Swoole,thinkphp也推出了最新的擴展think-swoole 3.0 安裝 由于目前thinkphp 6.0沒有穩定版本,所...
摘要:進程可以使用函數向進程投遞新的任務。當前的進程在調用回調函數時會將進程狀態切換為忙碌,這時將不再接收新的,當函數返回時會將進程狀態切換為空閑然后繼續接收新的。當進程投遞的任務在中完成時,進程會通過方法將任務處理的結果發送給進程。 swoole——從入門到放棄(一) 一、swoole的源碼包安裝 下載swoole源碼:git clone https://gitee.com/swoole...
閱讀 3076·2023-04-25 20:43
閱讀 1719·2021-09-30 09:54
閱讀 1590·2021-09-24 09:47
閱讀 2874·2021-09-06 15:02
閱讀 3510·2021-02-22 17:09
閱讀 1233·2019-08-30 15:53
閱讀 1441·2019-08-29 17:04
閱讀 1956·2019-08-28 18:22