swoole中進(jìn)程和線程的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹swoole中進(jìn)程和線程的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比夏縣網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式夏縣網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋夏縣地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
進(jìn)程

1、進(jìn)程之間不共享任何狀態(tài)
2、進(jìn)程的調(diào)度由操作系統(tǒng)完成
3、每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間
4、進(jìn)程間通訊主要是通過信號(hào)傳遞的方式來實(shí)現(xiàn)的,實(shí)現(xiàn)方式有多種,信號(hào)量、管道、事件等,任何一種方式的通訊效率都需要過內(nèi)核,導(dǎo)致通訊效率比較低
5、由于是獨(dú)立的內(nèi)存空間,上下文切換的時(shí)候需要保存先調(diào)用棧的信息、cpu各寄存器的信息、虛擬內(nèi)存、以及打開的相關(guān)句柄等信息,所以導(dǎo)致上下文進(jìn)程間切換開銷很大,通訊麻煩。

線程

1、線程之間共享變量,解決了通訊麻煩的問題對(duì)于變量的訪問需要鎖
2、一個(gè)進(jìn)程可以擁有多個(gè)線程,但是其中每個(gè)線程會(huì)共享父進(jìn)程像操作系統(tǒng)申請(qǐng)資源,這個(gè)包括虛擬內(nèi)存、文件等,由于是共享資源,所以創(chuàng)建線程所需要的系統(tǒng)資源占用比進(jìn)程小很多,相應(yīng)的可創(chuàng)建的線程數(shù)量也變得相對(duì)多很多。
3、另外在調(diào)度方面也是由于內(nèi)存是共享的,所以上下文切換的時(shí)候需要保存的東西就像對(duì)少一些,這樣一來上下文的切換也變得高效。

解釋
  • 通過php,運(yùn)行一個(gè)php文件,這個(gè)時(shí)候就相當(dāng)于我們創(chuàng)建了一個(gè)進(jìn)程,這個(gè)進(jìn)程會(huì)在系統(tǒng)中駐存,申請(qǐng)屬于它自己的內(nèi)存空間系統(tǒng)資源并且運(yùn)行相應(yīng)的程序。
    swoole中進(jìn)程和線程的示例分析

swoole進(jìn)程

swoole中進(jìn)程和線程的示例分析
1、Master進(jìn)程:主進(jìn)程
2、Manger進(jìn)程:管理進(jìn)程
3、Worker進(jìn)程:工作進(jìn)程
4、Task進(jìn)程:異步任務(wù)工作進(jìn)程

  • 第一層,Master進(jìn)程,這個(gè)是swoole的主進(jìn)程,這個(gè)進(jìn)程是用于處理swoole的核心事件驅(qū)動(dòng)的,那么在這個(gè)進(jìn)程當(dāng)中可以看到它擁有一個(gè)MainReactor[線程]以及若干個(gè)Reactor[線程],swoole所有對(duì)于事件的監(jiān)聽都會(huì)在這些線程中實(shí)現(xiàn),比如來自客戶端的連接,信號(hào)處理等。

  • 1.1、MainReactor(主線程)
    主線程會(huì)負(fù)責(zé)監(jiān)聽server socket,如果有新的連接accept,主線程會(huì)評(píng)估每個(gè)Reactor線程的連接數(shù)量。將此連接分配給連接數(shù)最少的reactor線程,做一個(gè)負(fù)載均衡。

  • 1.2 、Reactor線程組
    Reactor線程負(fù)責(zé)維護(hù)客戶端機(jī)器的TCP連接、處理網(wǎng)絡(luò)IO、收發(fā)數(shù)據(jù)完全是異步非阻塞的模式。
    swoole的主線程在Accept新的連接后,會(huì)將這個(gè)連接分配給一個(gè)固定的Reactor線程,在socket可讀時(shí)讀取數(shù)據(jù),并進(jìn)行協(xié)議解析,將請(qǐng)求投遞到Worker進(jìn)程。在socket可寫時(shí)將數(shù)據(jù)發(fā)送給TCP客戶端。

  • 1.3、心跳包檢測(cè)線程(HeartbeatCheck)
    Swoole配置了心跳檢測(cè)之后,心跳包線程會(huì)在固定時(shí)間內(nèi)對(duì)所有之前在線的連接
    發(fā)送檢測(cè)數(shù)據(jù)包

  • 1.4、UDP收包線程(UdpRecv)
    接收并且處理客戶端udp數(shù)據(jù)包

  • swoole想要實(shí)現(xiàn)好的性能必須創(chuàng)建出多個(gè)工作進(jìn)程幫助處理任務(wù),但Worker進(jìn)程就必須fork操作,但是fork操作是不安全的,如果沒有管理會(huì)出現(xiàn)很多的僵尸進(jìn)程,進(jìn)而影響服務(wù)器性能,同時(shí)worker進(jìn)程被誤殺或者由于程序的原因會(huì)異常退出,為了保證服務(wù)的穩(wěn)定性,需要重新創(chuàng)建worker進(jìn)程。

  • Swoole在運(yùn)行中會(huì)創(chuàng)建一個(gè)單獨(dú)的管理進(jìn)程,所有的worker進(jìn)程和task進(jìn)程都是從管理進(jìn)程Fork出來的。管理進(jìn)程會(huì)監(jiān)視所有子進(jìn)程的退出事件,當(dāng)worker進(jìn)程發(fā)生致命錯(cuò)誤或者運(yùn)行生命周期結(jié)束時(shí),管理進(jìn)程會(huì)回收此進(jìn)程,并創(chuàng)建新的進(jìn)程。換句話也就是說,對(duì)于worker、task進(jìn)程的創(chuàng)建、回收等操作全權(quán)有“保姆”Manager進(jìn)程進(jìn)行管理

  • worker 進(jìn)程屬于swoole的主邏輯進(jìn)程,用戶處理客戶端的一系列請(qǐng)求,接受由Reactor線程投遞的請(qǐng)求數(shù)據(jù)包,并執(zhí)行PHP回調(diào)函數(shù)處理數(shù)據(jù)生成響應(yīng)數(shù)據(jù)并發(fā)給Reactor線程,由Reactor線程發(fā)送給TCP客戶端可以是異步非阻塞模式,也可以是同步阻塞模式

  • taskWorker進(jìn)程這一進(jìn)城是swoole提供的異步工作進(jìn)程,這些進(jìn)程主要用于處理一些耗時(shí)較長(zhǎng)的同步任務(wù),在worker進(jìn)程當(dāng)中投遞過來。

client跟server的交互:

1、client請(qǐng)求到達(dá) Main Reactor,Client實(shí)際上是與Master進(jìn)程中的某個(gè)Reactor線程發(fā)生了連接。

2、Main Reactor根據(jù)Reactor的情況,將請(qǐng)求注冊(cè)給對(duì)應(yīng)的Reactor (每個(gè)Reactor都有epoll。用來監(jiān)聽客戶端的變化)

3、客戶端有變化時(shí)Reactor將數(shù)據(jù)交給worker來處理

4、worker處理完畢,通過進(jìn)程間通信(比如管道、共享內(nèi)存、消息隊(duì)列)發(fā)給對(duì)應(yīng)的reactor。

5、reactor將響應(yīng)結(jié)果發(fā)給相應(yīng)的連接請(qǐng)求處理完成

Master進(jìn)程內(nèi)的回調(diào)函數(shù)
  • onStart Server啟動(dòng)在主進(jìn)程的主線程回調(diào)此函數(shù)

  • onShutdown 此事件在Server正常結(jié)束時(shí)發(fā)生

Manager進(jìn)程內(nèi)的回調(diào)函數(shù)
  • onManagerStart 當(dāng)管理進(jìn)程啟動(dòng)時(shí)調(diào)用它

  • onManagerStop 當(dāng)管理進(jìn)程結(jié)束時(shí)調(diào)用它

  • onWorkerError 當(dāng)worker/task_worker進(jìn)程發(fā)生異常后會(huì)在Manager進(jìn)程內(nèi)回調(diào)此函數(shù)

Worker進(jìn)程內(nèi)的回調(diào)函數(shù)
  • onWorkerStart 此事件在Worker進(jìn)程/Task進(jìn)程啟動(dòng)時(shí)發(fā)生

  • onWorkerStop 此事件在worker進(jìn)程終止時(shí)發(fā)生。

  • onConnect 有新的連接進(jìn)入時(shí),在worker進(jìn)程中回調(diào)

  • onClose TCP客戶端連接關(guān)閉后,在worker進(jìn)程中回調(diào)此函數(shù)

  • onReceive 接收到數(shù)據(jù)時(shí)回調(diào)此函數(shù),發(fā)生在worker進(jìn)程中

  • onPacket 接收到UDP數(shù)據(jù)包時(shí)回調(diào)此函數(shù),發(fā)生在worker進(jìn)程中

  • onFinish 當(dāng)worker進(jìn)程投遞的任務(wù)在task_worker中完成時(shí),task進(jìn)程會(huì)通過finish()方法將任務(wù)處理的結(jié)果發(fā)送給worker進(jìn)程。

  • onWorkerExit 僅在開啟reload_async特性后有效。異步重啟特性

  • onPipeMessage 當(dāng)工作進(jìn)程收到由 sendMessage 發(fā)送的管道消息時(shí)會(huì)觸發(fā)事件

Task進(jìn)程內(nèi)的回調(diào)函數(shù)
  • onTask 在task_worker進(jìn)程內(nèi)被調(diào)用。worker進(jìn)程可以使用swoole_server_task函數(shù)向task_worker進(jìn)程投遞新的任務(wù)

  • onWorkerStart 此事件在Worker進(jìn)程/Task進(jìn)程啟動(dòng)時(shí)發(fā)生

  • onPipeMessage 當(dāng)工作進(jìn)程收到由 sendMessage 發(fā)送的管道消息時(shí)會(huì)觸發(fā)事件

簡(jiǎn)單說明:
  • 1、服務(wù)器關(guān)閉程序終止時(shí)最后一次事件是onShutdown。

  • 2、服務(wù)器啟動(dòng)成功后,onStart/onManagerStart/onWorkerStart會(huì)在不同的進(jìn)程內(nèi)并發(fā)執(zhí)行,并不是順序的。

  • 3、所有事件回調(diào)均在$server->start后發(fā)生,start之后寫的代碼是無效代碼。

  • 4、onStart/onManagerStart/onWorkerStart 3個(gè)事件的執(zhí)行順序是不確定的

swoole運(yùn)行流程圖

swoole中進(jìn)程和線程的示例分析

<?php//tcp協(xié)議$server=new Swoole\Server("0.0.0.0",9800);   //創(chuàng)建server對(duì)象$server->set([
    'worker_num'=>3, //設(shè)置進(jìn)程
    //'heartbeat_idle_time'=>10,//連接較大的空閑時(shí)間
    //'heartbeat_check_interval'=>3 //服務(wù)器定時(shí)檢查
    'open_length_check'=>1,
    'package_length_type'=>'N',//設(shè)置包頭的長(zhǎng)度
    'package_length_offset'=>0, //包長(zhǎng)度從哪里開始計(jì)算
    'package_body_offset'=>4,  //包體從第幾個(gè)字節(jié)開始計(jì)算
    'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){

    var_dump(1);
     //設(shè)置主進(jìn)程的名稱
     swoole_set_process_name("server-process:master");});//服務(wù)關(guān)閉時(shí)候觸發(fā)(信號(hào))$server->on("shutdown",function (){});//當(dāng)管理進(jìn)程啟動(dòng)時(shí)調(diào)用它$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);});//監(jiān)聽事件,連接事件(woker進(jìn)程當(dāng)中)$server->on('connect',function ($server,$fd){
    echo "新的連接進(jìn)入:{$fd}".PHP_EOL;});//消息發(fā)送過來(woker進(jìn)程當(dāng)中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){
    //var_dump("消息發(fā)送過來:".$data);
    //服務(wù)端});//消息關(guān)閉$server->on('close',function (){
    echo "消息關(guān)閉".PHP_EOL;});//服務(wù)器開啟$server->start();echo '123456';

以上是“swoole中進(jìn)程和線程的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁(yè)名稱:swoole中進(jìn)程和線程的示例分析-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.muchs.cn/article42/peghc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google品牌網(wǎng)站設(shè)計(jì)小程序開發(fā)、做網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)