摘要:概述啟動一個服務,開啟了哪些進程和線程為了解決這個問題,咱們啟動一個最簡單的服務,一起看看究竟啟動了哪些進程和線程然后結合官網(wǎng)運行流程圖,對每個進程和線程進行歸類?,F(xiàn)在我們了解了,啟動的這個服務使用了個進程個線程。
概述
Swoole 啟動一個服務,開啟了哪些進程和線程?
為了解決這個問題,咱們啟動一個最簡單的服務,一起看看究竟啟動了哪些進程和線程?
然后結合官網(wǎng)運行流程圖,對每個進程和線程進行歸類。
服務啟動后打印出當前 Swoole 版本 和 當前 CPU 核數(shù)。
打印 Swoole 版本,是讓大家可以下載這個版本 去運行代碼。
打印 CPU 核數(shù),是因為這個參數(shù)下面會用到。
廢話不多說,直接看代碼吧。
代碼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();
上面的代碼簡單說下,創(chuàng)建了一個 TCP 服務器,啟動了 3 個 worker 進程, 3 個 task 進程,因為啟用了 task 功能,所以必須注冊 onTask、onFinish 2 個事件的回調(diào)函數(shù)。
咱們運行一下:
使用 ps 查看下:
16390 的父進程是 16389。
16393、16394、16395、16396、16397、16398 的父進程是 16390。
有沒有發(fā)現(xiàn),16391、16392 去哪啦?是不是很奇怪。
再用 pstree 查看下:
出來了吧,16391、16392 是線程 與 16390 進程一個層級。
現(xiàn)在我們了解了,啟動的這個服務使用了 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 進程?
因為,在創(chuàng)建服務的時候我們進行了設置 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 線程數(shù),默認為 SWOOLE_CPU_NUM,也可以通過 reactor_num 參數(shù)進行設置。
reactor_num 文檔:
https://wiki.swoole.com/wiki/...
它是真正處理 TCP 連接,收發(fā)數(shù)據(jù)的線程。
Reactor線程 文檔:
https://wiki.swoole.com/wiki/...
三、Reactor、Worker、TaskWorker 的關系是什么樣的?
一個通俗的比喻,假設Server就是一個工廠,那Reactor就是銷售,接受客戶訂單。而Worker就是工人,當銷售接到訂單后,Worker去工作生產(chǎn)出客戶要的東西。而TaskWorker可以理解為行政人員,可以幫助Worker干些雜事,讓Worker專心工作。
官方已經(jīng)解釋的很詳細了,看官方文檔吧:
https://wiki.swoole.com/wiki/...
如果你想入門學習 Swoole 可以看下這個 《Swoole 文章匯總(10 篇)》。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/31772.html
摘要:是緩存區(qū)高水位線,達到了說明緩沖區(qū)即將滿了創(chuàng)建線程函數(shù)用于將監(jiān)控的存放于中向中添加監(jiān)聽的文件描述符等待所有的線程開啟事件循環(huán)利用創(chuàng)建線程,線程啟動函數(shù)是保存監(jiān)聽本函數(shù)將用于監(jiān)聽的存放到當中,并設置相應的屬性 Server 的啟動 在 server 啟動之前,swoole 首先要調(diào)用 php_swoole_register_callback 將 PHP 的回調(diào)函數(shù)注冊到 server...
摘要:超過此數(shù)量后,新進入的連接將被拒絕。表示連接最大允許空閑的時間。當出錯時底層會認為是惡意連接,丟棄數(shù)據(jù)并強制關閉連接。在啟動時自動將進程的寫入到文件,在關閉時自動刪除文件。 配置說明 $server->set(array( daemonize => true, log_file => /www/log/swoole.log, reactor_num => 2, ...
摘要:管理進程會監(jiān)視所有子進程的退出事件,當進程發(fā)生致命錯誤或者運行生命周期結束時,管理進程會回收此進程,并創(chuàng)建新的進程。換句話也就是說,對于進程的創(chuàng)建回收等操作全權有保姆進程進行管理。跟的交互請求到達實際上是與進程中的某個線程發(fā)生了連接。 showImg(https://segmentfault.com/img/bVbrhb2?w=600&h=360); 一、進程的基本知識 什么是進程,所...
摘要:前言即將迎來最新版本,針對目前越來越流行,也推出了最新的擴展安裝由于目前沒有穩(wěn)定版本,所以只能安裝開發(fā)板接下來安裝,目前最新的穩(wěn)定版本是配置安裝結束可以根據(jù)自己的需求對配置信息進行修改。 前言 ThinkPHP即將迎來最新版本6.0,針對目前越來越流行Swoole,thinkphp也推出了最新的擴展think-swoole 3.0 安裝 由于目前thinkphp 6.0沒有穩(wěn)定版本,所...
摘要:進程可以使用函數(shù)向進程投遞新的任務。當前的進程在調(diào)用回調(diào)函數(shù)時會將進程狀態(tài)切換為忙碌,這時將不再接收新的,當函數(shù)返回時會將進程狀態(tài)切換為空閑然后繼續(xù)接收新的。當進程投遞的任務在中完成時,進程會通過方法將任務處理的結果發(fā)送給進程。 swoole——從入門到放棄(一) 一、swoole的源碼包安裝 下載swoole源碼:git clone https://gitee.com/swoole...
閱讀 3216·2023-04-25 20:43
閱讀 1800·2021-09-30 09:54
閱讀 1658·2021-09-24 09:47
閱讀 2972·2021-09-06 15:02
閱讀 3575·2021-02-22 17:09
閱讀 1327·2019-08-30 15:53
閱讀 1515·2019-08-29 17:04
閱讀 2034·2019-08-28 18:22