目錄
進程
線程
解釋
swoole行程
client跟server的互動:
Master行程內的回呼函數
Manager程序內的回呼函數
Worker進程內的回呼函數
Task進程內的回呼函數
簡單說明:
swoole執行流程圖
Master進程內的回呼函數
首頁 php框架 Swoole 你對swoole的進程,線程知道多少

你對swoole的進程,線程知道多少

Nov 24, 2020 pm 04:47 PM
swoole 執行緒 行程

swoole教學專欄介紹swoole的進程,執行緒。

你對swoole的進程,線程知道多少

推薦(免費):swoole教學
進程

1、進程之間不共享任何狀態
2、進程的調度由作業系統完成
3、每個進程都有自己獨立的記憶體空間
4、進程間通訊主要是透過訊號傳遞的方式來實現的,實現方式有多種,信號量、管道、事件等,任何一種方式的通訊效率都需要過內核,導致通訊效率比較低
5、由於是獨立的內存空間,上下文切換的時候需要保存先調用棧的信息、cpu各暫存器的資訊、虛擬記憶體、以及開啟的相關句柄等訊息,所以導致上下文進程間切換開銷很大,通訊麻煩。

線程

1、線程之間共享變量,解決了通訊麻煩的問題對於變量的訪問需要鎖定
2、一個進程可以擁有多個線程,但是其中每個執行緒會共享父進程像作業系統申請資源,這包括虛擬記憶體、檔案等,由於是共享資源,所以創建執行緒所需的系統資源佔用比進程小很多,對應的可建立的執行緒數量也變得相對多很多。
3.另外在調度方面也是由於記憶體是共享的,所以上下文切換的時候需要保存的東西就像對少一些,這樣一來上下文的切換也變得高效。

解釋
  • 透過php,運行一個php文件,這個時候就相當於我們創建了一個進程,這個進程會在系統中駐存,申請屬於它自己的內存空間系統資源並且運行相應的程式。
    你對swoole的進程,線程知道多少
swoole行程

你對swoole的進程,線程知道多少
1、Master行程:主程式
2、Manger行程:管理程式
3 、Worker進程:工作進程
4、Task進程:非同步任務工作進程

  • 第一層,Master進程,這個是swoole的主進程,這個進程是用來處理swoole的核心事件驅動的,那麼在這個進程當中可以看到它擁有一個MainReactor[線程]以及若干個Reactor[線程],swoole所有對於事件的監聽都會在這些線程中實現,比如來自客戶端的連接,信號處理等。

  • 1.1、MainReactor(主執行緒)
    主執行緒會負責監聽server socket,如果有新的連線accept,主執行緒會評估每個Reactor執行緒的連線數量。將此連線分配給連線數最少的reactor線程,做一個負載平衡。

  • 1.2 、Reactor執行緒群組
    Reactor執行緒負責維護客戶端機器的TCP連線、處理網路IO、收發資料完全是異步非阻塞的模式。
    swoole的主線程在Accept新的連接後,會將這個連接分配給一個固定的Reactor線程,在socket可讀時讀取數據,並進行協議解析,將請求投遞到Worker進程。在socket可寫入時將資料傳送給TCP客戶端。

  • 1.3、心跳包偵測執行緒(HeartbeatCheck)
    Swoole配置了心跳偵測之後,心跳包執行緒會在固定時間內對所有先前線上的連線
    傳送偵測封包

  • 1.4、UDP收包執行緒(UdpRecv)
    接收並且處理客戶端udp封包

  • swoole想要實現最好的效能必須創建出多個工作進程幫助處理任務,但Worker進程就必須fork操作,但是fork操作是不安全的,如果沒有管理會出現很多的殭屍進程,進而影響伺服器效能,同時worker進程被誤殺或因為程式的原因會異常退出,為了確保服務的穩定性,需要重新建立worker流程。

  • Swoole在運行時會建立一個單獨的管理進程,所有的worker進程和task進程都是從管理進程Fork出來的。管理進程會監視所有子進程的退出事件,當worker進程發生致命錯誤或執行生命週期結束時,管理進程會回收此進程,並建立新的進程。換句話說,對於worker、task進程的建立、回收等操作全權有「保姆」Manager進程進行管理

  • worker 進程屬於swoole的主邏輯進程,使用者處理客戶端的一系列請求,接受由Reactor線程投遞的請求資料包,並執行PHP回呼函數處理資料產生回應資料並發給Reactor執行緒,由Reactor線程發送給TCP客戶端可以是異步非阻塞模式,也可以是同步阻塞模式

  • taskWorker進程這一進城是swoole提供的非同步工作進程,這些進程主要用於處理一些耗時較長的同步任務,在worker進程中投遞過來。

client跟server的互動:

1、client要求到達 Main Reactor,Client其實是與Master行程中的某個Reactor執行緒發生了連線。

2、Main Reactor根據Reactor的情況,將請求註冊給對應的Reactor (每個Reactor都有epoll。用來監聽客戶端的變化)

3、客戶端有變化時Reactor將資料交給worker來處理

4、worker處理完畢,透過進程間通訊(例如管道、共享記憶體、訊息佇列)發給對應的reactor。

5、reactor將回應結果發給對應的連線請求處理完成

Master行程內的回呼函數
  • onStart Server啟動在主行程的主執行緒回調此函數
  • onShutdown 此事件在Server正常結束時發生
Manager程序內的回呼函數
  • onManagerStart 當管理程序啟動時呼叫它
  • onManagerStop 當管理進程結束時呼叫它
  • onWorkerError 當worker/task_worker進程發生異常後會在Manager進程內回調此函數
Worker進程內的回呼函數
  • onWorkerStart 此事件在Worker進程/Task進程啟動時發生
  • onWorkerStop 此事件在worker進程終止時發生。
  • onConnect 有新的連線進入時,在worker進程中回呼
  • onClose TCP用戶端連線關閉後,在worker進程中回呼此函數
  • onReceive 接收到數據時回呼此函數,發生在worker進程中
  • onPacket 接收到UDP封包時回呼此函數,發生在worker進程中
  • onFinish 當worker進程投遞的任務在task_worker中完成時,task進程會透過finish()方法將任務處理的結果傳送給worker進程。
  • onWorkerExit 僅在開啟reload_async特性後有效。非同步重新啟動特性
  • onPipeMessage 當工作程序收到由sendMessage 發送的管道訊息時會觸發事件
Task進程內的回呼函數
  • #onTask在task_worker進程內被呼叫。 worker程序可以使用swoole_server_task函數向task_worker程序投遞新的任務
  • onWorkerStart 此事件在Worker程序/Task程序啟動時發生
  • onPipeMessage 當工作程序收到由sendMessage 傳送的管道訊息時會觸發事件
簡單說明:
  • 1、伺服器關閉程式終止時最後一次事件是onShutdown。
  • 2、伺服器啟動成功後,onStart/onManagerStart/onWorkerStart會在不同的進程內並發執行,並不是順序的。
  • 3、所有事件回呼均在$server->start後發生,start之後寫的程式碼是無效程式碼。
  • 4、onStart/onManagerStart/onWorkerStart 3個事件的執行順序是不確定的
swoole執行流程圖

你對swoole的進程,線程知道多少

<?php //tcp协议$server=new Swoole\Server("0.0.0.0",9800);   //创建server对象$server->set([
    'worker_num'=>3, //设置进程
    //'heartbeat_idle_time'=>10,//连接最大的空闲时间
    //'heartbeat_check_interval'=>3 //服务器定时检查
    'open_length_check'=>1,
    'package_length_type'=>'N',//设置包头的长度
    'package_length_offset'=>0, //包长度从哪里开始计算
    'package_body_offset'=>4,  //包体从第几个字节开始计算
    'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){

    var_dump(1);
     //设置主进程的名称
     swoole_set_process_name("server-process:master");});//服务关闭时候触发(信号)$server->on("shutdown",function (){});//当管理进程启动时调用它$server->on('ManagerStart',function (){
    var_dump(2);
    //swoole_set_process_name("server-process:manger");});$server->on('WorkerStart',function ($server,$workerId){
   // swoole_set_process_name("server-process:worker");
    var_dump(3);});//监听事件,连接事件(woker进程当中)$server->on('connect',function ($server,$fd){
    echo "新的连接进入:{$fd}".PHP_EOL;});//消息发送过来(woker进程当中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){
    //var_dump("消息发送过来:".$data);
    //服务端});//消息关闭$server->on('close',function (){
    echo "消息关闭".PHP_EOL;});//服务器开启$server->start();echo '123456';
登入後複製
登入後複製
進程

1、進程之間不共用任何狀態
2、行程的調度由作業系統完成
3、每個行程都有自己獨立的記憶體空間
4、進程間通訊主要是透過訊號傳遞的方式來實現的,實作方式有多種,訊號量、管道、事件等,任何一種方式的通訊效率都需要過內核,導致通訊效率比較低
5、由於是獨立的內存空間,上下文切換的時候需要保存先調用棧的信息、cpu各寄存器的信息、虛擬內存、以及打開的相關句柄等訊息,所以導致上下文進程間切換開銷很大,通訊麻煩。

線程

1、線程之間共享變量,解決了通訊麻煩的問題對於變量的訪問需要鎖定
# 2、一個進程可以擁有多個線程,但是其中每個線程會共享父進程像作業系統申請資源,這個包括虛擬記憶體、檔案等,由於是共享資源,所以創建線程所需要的系統資源佔用比進程小得多,相應的可創建的線程數量也變得相對多得多。
3.另外在調度方面也是由於記憶體是共享的,所以上下文切換的時候需要保存的東西就像對少一些,這樣一來上下文的切換也變得高效。

解釋
  • 透過php,運行一個php文件,這個時候就相當於我們創建了一個進程,這個進程會在系統中駐存,申請屬於它自己的內存空間系統資源並且運行相應的程式。
    你對swoole的進程,線程知道多少
swoole行程

你對swoole的進程,線程知道多少
1、Master行程:主程式
2、Manger行程:管理程式
3 、Worker進程:工作進程
4、Task進程:非同步任務工作進程

  • 第一層,Master進程,這個是swoole的主進程,這個進程是用來處理swoole的核心事件驅動的,那麼在這個進程當中可以看到它擁有一個MainReactor[線程]以及若干個Reactor[線程],swoole所有對於事件的監聽都會在這些線程中實現,比如來自客戶端的連接,信號處理等。

  • 1.1、MainReactor(主執行緒)
    主執行緒會負責監聽server socket,如果有新的連線accept,主執行緒會評估每個Reactor執行緒的連線數量。將此連線分配給連線數最少的reactor線程,做一個負載平衡。

  • 1.2 、Reactor執行緒群組
    Reactor執行緒負責維護客戶端機器的TCP連線、處理網路IO、收發資料完全是異步非阻塞的模式。
    swoole的主線程在Accept新的連接後,會將這個連接分配給一個固定的Reactor線程,在socket可讀時讀取數據,並進行協議解析,將請求投遞到Worker進程。在socket可寫入時將資料傳送給TCP客戶端。

  • 1.3、心跳包偵測執行緒(HeartbeatCheck)
    Swoole配置了心跳偵測之後,心跳包執行緒會在固定時間內對所有先前線上的連線
    傳送偵測封包

  • 1.4、UDP收包執行緒(UdpRecv)
    接收並且處理客戶端udp封包

  • swoole想要實現最好的效能必須創建出多個工作進程幫助處理任務,但Worker進程就必須fork操作,但是fork操作是不安全的,如果沒有管理會出現很多的殭屍進程,進而影響伺服器效能,同時worker進程被誤殺或因為程式的原因會異常退出,為了確保服務的穩定性,需要重新建立worker流程。

  • Swoole在運行時會建立一個單獨的管理進程,所有的worker進程和task進程都是從管理進程Fork出來的。管理進程會監視所有子進程的退出事件,當worker進程發生致命錯誤或執行生命週期結束時,管理進程會回收此進程,並建立新的進程。換句話說,對於worker、task進程的創建、回收等操作全權有「保姆」Manager進程進行管理

  • worker 進程屬於swoole的主邏輯進程,用戶處理客戶端的一系列請求,接受由Reactor線程投遞的請求資料包,並執行PHP回呼函數處理資料產生回應資料並發給Reactor線程,由Reactor線程傳送給TCP客戶端可以是非同步非阻塞模式,也可以是同步阻塞模式

  • taskWorker進程這一進城是swoole提供的非同步工作進程,這些進程主要用於處理一些耗時較長的同步任務,在worker進程中投遞過來。

client跟server的互動:

1、client要求到達 Main Reactor,Client其實是與Master行程中的某個Reactor執行緒發生了連線。

2、Main Reactor根據Reactor的情況,將請求註冊給對應的Reactor (每個Reactor都有epoll。用來監聽客戶端的變化)

3、客戶端有變化時Reactor將資料交給worker來處理

4、worker處理完畢,透過進程間通訊(例如管道、共享記憶體、訊息佇列)發給對應的reactor。

5、reactor將回應結果發給對應的連線請求處理完成

#
Master進程內的回呼函數
  • onStart Server啟動在主程序的主執行緒回呼此函數
  • onShutdown 此事件在Server正常結束時發生
  • ##Manager進程內的回呼函數
  • onManagerStart 當管理進程啟動時呼叫它
  • onManagerStop 當管理進程結束時呼叫它
  • onWorkerError 當worker /task_worker程序發生異常後會在Manager進程內回呼此函數
Worker進程內的回呼函數
  • onWorkerStart 此事件在Worker進程/Task進程啟動時發生
  • onWorkerStop 此事件在worker進程終止時發生。
  • onConnect 有新的連線進入時,在worker進程中回呼
onClose TCP用戶端連線關閉後,在worker進程中回呼此函數
onReceive 接收到數據時回呼此函數,發生在worker進程中
  • onPacket 接收到UDP封包時回呼此函數,發生在worker進程中
  • onFinish 當worker進程投遞的任務在task_worker中完成時,task進程會透過finish()方法將任務處理的結果傳送給worker進程。
  • onWorkerExit 僅在開啟reload_async特性後有效。非同步重新啟動特性
  • onPipeMessage 當工作程序收到由sendMessage 發送的管道訊息時會觸發事件
Task進程內的回呼函數

你對swoole的進程,線程知道多少#onTask在task_worker進程內被呼叫。 worker程序可以使用swoole_server_task函數向task_worker程序投遞新的任務

###onWorkerStart 此事件在Worker程序/Task程序啟動時發生######onPipeMessage 當工作程序收到由sendMessage 傳送的管道訊息時會觸發事件#########簡單說明:#########1、伺服器關閉程式終止時最後一次事件是onShutdown。 ######2、伺服器啟動成功後,onStart/onManagerStart/onWorkerStart會在不同的進程內並發執行,並不是順序的。 ######3、所有事件回呼均在$server->start後發生,start之後寫的程式碼是無效程式碼。 ######4、onStart/onManagerStart/onWorkerStart 3個事件的執行順序是不確定的#########swoole執行流程圖###########
<?php //tcp协议$server=new Swoole\Server("0.0.0.0",9800);   //创建server对象$server->set([
    'worker_num'=>3, //设置进程
    //'heartbeat_idle_time'=>10,//连接最大的空闲时间
    //'heartbeat_check_interval'=>3 //服务器定时检查
    'open_length_check'=>1,
    'package_length_type'=>'N',//设置包头的长度
    'package_length_offset'=>0, //包长度从哪里开始计算
    'package_body_offset'=>4,  //包体从第几个字节开始计算
    'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){

    var_dump(1);
     //设置主进程的名称
     swoole_set_process_name("server-process:master");});//服务关闭时候触发(信号)$server->on("shutdown",function (){});//当管理进程启动时调用它$server->on('ManagerStart',function (){
    var_dump(2);
    //swoole_set_process_name("server-process:manger");});$server->on('WorkerStart',function ($server,$workerId){
   // swoole_set_process_name("server-process:worker");
    var_dump(3);});//监听事件,连接事件(woker进程当中)$server->on('connect',function ($server,$fd){
    echo "新的连接进入:{$fd}".PHP_EOL;});//消息发送过来(woker进程当中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){
    //var_dump("消息发送过来:".$data);
    //服务端});//消息关闭$server->on('close',function (){
    echo "消息关闭".PHP_EOL;});//服务器开启$server->start();echo '123456';
登入後複製
登入後複製

以上是你對swoole的進程,線程知道多少的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

解釋一下explorer.exe進程是什麼 解釋一下explorer.exe進程是什麼 Feb 18, 2024 pm 12:11 PM

explorer.exe是什麼進程在我們使用Windows作業系統的時候,常常會聽到一個名詞"explorer.exe".那麼,你是否好奇這個進程到底是什麼?在本文中,我們將詳細解釋explorer.exe是什麼進程以及其功能和作用。首先,explorer.exe是Windows作業系統的關鍵流程,它負責管理和控制Windows資源管理器(Window

請問ccsvchst.exe是哪一種進程? 請問ccsvchst.exe是哪一種進程? Feb 19, 2024 pm 11:33 PM

ccsvchst.exe是一種常見的進程文件,它是SymantecEndpointProtection(SEP)軟體的一部分,而SEP則是一款由著名的網路安全公司Symantec開發的終端保護解決方案。作為該軟體的一部分,ccsvchst.exe負責管理和監控SEP的相關進程。首先,我們來了解SymantecEndpointProtection(

如何正確殺死Linux中的殭屍行程 如何正確殺死Linux中的殭屍行程 Feb 19, 2024 am 10:40 AM

在Linux系統中,殭屍行程是已經終止但仍保留在系統中的特殊流程。雖然殭屍行程不會消耗太多資源,但如果數量太多,可能會導致系統資源耗盡。本文將介紹如何正確清除殭屍進程,以確保系統的正常運作。 1Linux殭屍行程子程序完成任務後,如果父行程沒有及時檢查狀態,子行程將成為殭屍行程。子進程在等待父進程確認,完成後系統才會回收。否則,殭屍行程會繼續懸掛在系統中。若要檢查系統中是否有殭屍進程,可透過執行命令top來查看所有正在執行的進程及可能存在的殭屍進程。 ‘top’指令的結果從上圖可以看到Linux中進

Linux進程優先權調整方法詳解 Linux進程優先權調整方法詳解 Mar 15, 2024 am 08:39 AM

Linux程序優先級調整方法詳解在Linux系統中,進程的優先順序決定了其在系統中的執行順序和資源分配。合理調整進程的優先順序可以提高系統的效能和效率。本文將詳細介紹Linux中如何調整進程的優先級,並提供具體的程式碼範例。一、進程優先權概述在Linux系統中,每個行程都有一個與之相關聯的優先權。優先權的範圍一般是-20到19,其中-20表示最高優先權,19表

swoole協程如何在laravel使用 swoole協程如何在laravel使用 Apr 09, 2024 pm 06:48 PM

Laravel 中使用 Swoole 協程可以並發處理大量請求,優點包括:同時處理:允許同時處理多個請求。高效能:基於 Linux epoll 事件機制,高效處理請求。低資源消耗:所需伺服器資源更少。易於整合:與 Laravel 框架無縫集成,使用簡單。

swoole和workerman哪個好 swoole和workerman哪個好 Apr 09, 2024 pm 07:00 PM

Swoole 和 Workerman 都是高效能 PHP 伺服器框架。 Swoole 以其非同步處理、出色的效能和可擴展性而聞名,適用於需要處理大量並發請求和高吞吐量的專案。 Workerman 提供了非同步和同步模式的靈活性,具有直覺的 API,更適合易用性和處理較低並發量的專案。

為什麼Linux中的行程會處於休眠狀態? 為什麼Linux中的行程會處於休眠狀態? Mar 20, 2024 pm 02:09 PM

為什麼Linux中的行程會處於休眠狀態?在Linux作業系統中,進程可能會處於休眠狀態,這是由於多種不同的原因和條件造成的。當進程處於休眠狀態時,表示該進程暫時被掛起,無法繼續執行,直到滿足某種條件後才能被喚醒繼續執行。接下來將詳細介紹在Linux中進程進入休眠狀態的幾種常見情況,並透過具體的程式碼範例加以說明。等待I/O完成:當進程發起一個I/O操作(例如讀取

swoole框架怎麼重啟服務 swoole框架怎麼重啟服務 Apr 09, 2024 pm 06:15 PM

若要重新啟動 Swoole 服務,請依照下列步驟操作:檢查服務狀態並取得 PID。使用 "kill -15 PID" 停止服務。使用啟動服務的相同命令重新啟動服務。

See all articles