站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

介紹swoole之進(jìn)程模型

介紹swoole之進(jìn)程模型

初識(shí)server一文的時(shí)候我們說(shuō)過(guò),swoole是事件驅(qū)動(dòng)的。在使用swoole的過(guò)程中,我們也體會(huì)到,swoole的使用非常簡(jiǎn)單,僅僅注冊(cè)相應(yīng)的回調(diào)處理我們的業(yè)務(wù)邏輯即可。

但是,在繼續(xù)學(xué)習(xí)swoole之前,我們有必要再看一看swoole的運(yùn)行流程和進(jìn)程模型。

推薦(免費(fèi)):swoole

前面兩篇文章我們已經(jīng)對(duì)server和task做了簡(jiǎn)單的介紹,后面再對(duì)server的創(chuàng)建以及腳本的執(zhí)行,如無(wú)特殊說(shuō)明均在CLI下執(zhí)行,我就不啰嗦了。

現(xiàn)在,我們創(chuàng)建一個(gè)簡(jiǎn)單的server來(lái)分析一下,文件命名為server-process.php

$serv = new swoole_server('127.0.0.1', 9501); $serv->set([     'worker_num' => 2,     'task_worker_num' => 1, ]); $serv->on('Connect', function ($serv, $fd) { }); $serv->on('Receive', function ($serv, $fd, $fromId, $data) { }); $serv->on('Close', function ($serv, $fd) { }); $serv->on('Task', function ($serv, $taskId, $fromId, $data) { }); $serv->on('Finish', function ($serv, $taskId, $data) { });  $serv->start();

注意這里我們選擇了兩個(gè)worker進(jìn)程個(gè)一個(gè)task進(jìn)程,那是不是就意味著創(chuàng)建這個(gè)server就是開(kāi)啟了3個(gè)進(jìn)程呢?我們來(lái)看下

新開(kāi)一個(gè)終端,我們用ps命令看下結(jié)果

$ ps aux | grep server-process root     21843  xxx... php server-process.php root     21844  xxx... php server-process.php root     21846  xxx... php server-process.php root     21847  xxx... php server-process.php root     21848  xxx... php server-process.php root     21854  xxx... grep --color=auto server-process

為了方便閱讀,ps的結(jié)果中部分不重要數(shù)據(jù)已經(jīng)被稍加處理了。

排除最后一個(gè)結(jié)果(最后一個(gè)是我們運(yùn)行的ps命令)我們發(fā)現(xiàn),竟然有多達(dá)5個(gè)相似的進(jìn)程在運(yùn)行,按照我們理解,不應(yīng)該是3個(gè)嗎,怎么多了兩個(gè)呢?

還記得我們?cè)谶M(jìn)程/線(xiàn)程一文中說(shuō)過(guò)的多進(jìn)程的實(shí)現(xiàn)嗎?我們說(shuō)到多進(jìn)程的實(shí)現(xiàn)一般會(huì)被設(shè)計(jì)Master-Worker模式,常見(jiàn)的nginx默認(rèn)的多進(jìn)程模式也正是如此,當(dāng)然swoole默認(rèn)的也是多進(jìn)程模型。

相比Master-Worker模式,swoole的進(jìn)程模型可以用Master-Manager-Worker來(lái)形容。即在Master-Worker的基礎(chǔ)上又增加了一層Manager進(jìn)程。這也就解答了我們開(kāi)頭拋出的問(wèn)題為什么是5個(gè)進(jìn)程而不是3個(gè)進(jìn)程了。(1個(gè)Master進(jìn)程+1個(gè)Manager進(jìn)程+2個(gè)Worker進(jìn)程+1個(gè)Task進(jìn)程)

正所謂“存在即合理”,我們來(lái)看一下MasterManagerWorker三種進(jìn)程各自存在的原因。

Master進(jìn)程是一個(gè)多線(xiàn)程程序。注解:按照我們之前的理解,多個(gè)線(xiàn)程是運(yùn)行在單一進(jìn)程的上下文中的,其實(shí)對(duì)于單一進(jìn)程中的每一個(gè)線(xiàn)程,都有它自己的上下文,但是由于共同存在于同一進(jìn)程,所以它們也共享這個(gè)進(jìn)程,包括它的代碼、數(shù)據(jù)等等。

再回來(lái)繼續(xù)說(shuō)Master進(jìn)程,Master進(jìn)程就是我們的主進(jìn)程,掌管生殺大權(quán),它掛了,那底下的都得玩完。Master進(jìn)程,包括主線(xiàn)程,多個(gè)Reactor線(xiàn)程等。

每一個(gè)線(xiàn)程都有自己的用途,比如主線(xiàn)程用于Accept、信號(hào)處理等操作,而Reactor線(xiàn)程是處理tcp連接,處理網(wǎng)絡(luò)IO,收發(fā)數(shù)據(jù)的線(xiàn)程。

說(shuō)明兩點(diǎn):

  • 主線(xiàn)程的Accept操作,socket服務(wù)端經(jīng)常用accept阻塞,上一節(jié)介紹socket編程的時(shí)候有一張配圖,可以看看
  • 信號(hào)處理,信號(hào)就相當(dāng)于一條消息,比如我們經(jīng)常操作的Ctrl+C其實(shí)就是給Master進(jìn)程的主線(xiàn)程發(fā)送一個(gè)SIGINT的信號(hào),意思就是你可以終止啦,信號(hào)有很多種,后面還有介紹

通常,主線(xiàn)程處理完新的連接后,會(huì)將這個(gè)連接分配給固定的Reactor線(xiàn)程,并且這個(gè)Reactor線(xiàn)程會(huì)一直負(fù)責(zé)監(jiān)聽(tīng)此socket(上文中后面對(duì)socket更新為socket即套接字,是用來(lái)與另一個(gè)進(jìn)程進(jìn)行跨網(wǎng)絡(luò)通信的文件,文件可讀可寫(xiě)),換句話(huà)就是說(shuō)當(dāng)此socket可讀時(shí),會(huì)讀取數(shù)據(jù),并將該請(qǐng)求分配給worker進(jìn)程,這也就解釋了我們?cè)趕woole初識(shí)講解worker進(jìn)程內(nèi)的回調(diào)onReceive的第三個(gè)參數(shù)$fromId的含義;當(dāng)此socket可寫(xiě)時(shí),會(huì)把數(shù)據(jù)發(fā)送給tcp客戶(hù)端。

用一張圖清晰的梳理下

介紹swoole之進(jìn)程模型

那swoole為啥不能像Nginx一樣,是Master-Worker進(jìn)程結(jié)構(gòu)的呢?Manager進(jìn)程是干啥的?

這個(gè)我正準(zhǔn)備說(shuō)。

我們知道,在Master-Worker模型中,Master只有一個(gè),Worker是由父進(jìn)程Master進(jìn)程復(fù)制出來(lái)的,且Worker進(jìn)程可以有多個(gè)。

注解:在linux中,父進(jìn)程可以通過(guò)調(diào)用fork函數(shù)創(chuàng)建一個(gè)新的子進(jìn)程,子進(jìn)程是父進(jìn)程的一個(gè)副本,幾乎但不完全相同,二者的最大區(qū)別就是都擁有自己獨(dú)立的進(jìn)程ID,即PID。

對(duì)于多線(xiàn)程的Master進(jìn)程而言,想要多Worker進(jìn)程就必須fork操作,但是fork操作是不安全的,所以,在swoole中,有一個(gè)專(zhuān)職的Manager進(jìn)程,Manager進(jìn)程就專(zhuān)門(mén)負(fù)責(zé)worker/task進(jìn)程的fork操作和管理。換句話(huà)也就是說(shuō),對(duì)于worker進(jìn)程的創(chuàng)建、回收等操作全權(quán)有“保姆”Manager進(jìn)程進(jìn)行管理。

通常,worker進(jìn)程被誤殺或者由于程序的原因會(huì)異常退出,Manager進(jìn)程為了保證服務(wù)的穩(wěn)定性,會(huì)重新拉起新的worker進(jìn)程,意思就是Worker進(jìn)程你發(fā)生意外“死”了,沒(méi)關(guān)系,我自身不“死”,就可以fork千千萬(wàn)萬(wàn)個(gè)你。

當(dāng)然,Master進(jìn)程和Manager進(jìn)程我們是不怎么關(guān)心的,從前面兩篇文章我們了解到,真正實(shí)現(xiàn)業(yè)務(wù)邏輯,是在worker/task進(jìn)程內(nèi)完成的。

再來(lái)一張圖梳理下Manager進(jìn)程和Worker/Task進(jìn)程的關(guān)系。

介紹swoole之進(jìn)程模型

再回到我們開(kāi)篇拋出的的5個(gè)進(jìn)程的問(wèn)題,ps的結(jié)果簡(jiǎn)直一模一樣,有沒(méi)有辦法能區(qū)分這5個(gè)進(jìn)程哪個(gè)是哪個(gè)呢?

有同學(xué)要說(shuō)啦,既然各個(gè)進(jìn)程之間存在父子關(guān)系,那我們就可以通過(guò)linux的pstree命令查看結(jié)果。

$ pstree | grep server-process   | |   -+= 02548 manks php server-process.php   | |     -+- 02549 manks php server-process.php   | |       |--- 02550 manks php server-process.php   | |       |--- 02551 manks php server-process.php   | |       --- 02552 manks php server-process.php   |     --- 02572 manks grep server-process

注:centos下命令可修改為 pstree -ap | grep server-process

從結(jié)果中我們可以看出,進(jìn)程id等于02548的進(jìn)程就是Master進(jìn)程,因?yàn)閺慕Y(jié)構(gòu)上看就它是“父”嘛,02549是Manager進(jìn)程,Worker進(jìn)程和Task進(jìn)程就是02550、02551和02552了(每個(gè)人的電腦上顯示的進(jìn)程id可能不同,但順序是一致的,依照此模型分析即可)。

我們看到pstree命令也只能得到大致結(jié)果,而且在事先不知道的情況下,根本無(wú)法區(qū)分Worker進(jìn)程和Task進(jìn)程。

在swoole中,我們可以在各個(gè)進(jìn)程啟動(dòng)和關(guān)閉的回調(diào)中去解決上面這個(gè)問(wèn)題。各個(gè)進(jìn)程的啟動(dòng)和關(guān)閉?那豈不是又要記住主進(jìn)程、Manager進(jìn)程、Worker進(jìn)程,二三得六,6個(gè)回調(diào)函數(shù)?

是的,不過(guò)這6個(gè)是最簡(jiǎn)單也是最好記的,你實(shí)際需要了解的可能還要

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
亚洲AV成人精品网站在线播放| 精品国产网红福利在线观看| 国产精品成人四虎免费视频| 在线精品一区二区三区| 久久精品国产99国产精品亚洲| 杨幂国产精品福利在线观看| 久久夜色精品国产亚洲| 亚洲精品国产成人片| 思思久久精品在热线热| 99久久这里只有精品| 久久久久成人精品无码| 精品99又大又爽又硬少妇毛片| 无码精品人妻一区二区三区影院 | 午夜亚洲国产精品福利| 国产精品无码翘臀在线观看| 精品无码成人久久久久久| 97色精品视频在线观看| 午夜精品不卡电影在线观看| 精品久久久久久亚洲中文字幕 | 亚洲一区无码精品色| 亚洲国产精品不卡毛片a在线| 丰满人妻熟妇乱又伦精品软件| 尤物国精品午夜福利视频| 国产精品第一区第27页| 精品无码久久久久久久久久| 久久中文精品无码中文字幕| 99久久婷婷免费国产综合精品| 国产乱人伦偷精品视频AAA| 国产精品国产三级国产普通话| 久久精品国产亚洲av麻豆| 亚洲第一精品福利| 99国产精品自在自在久久| 自怕偷自怕亚洲精品| 精品国产a∨无码一区二区三区| 国产精品中文字幕在线观看| 亚洲精品亚洲人成在线| 精品久久久中文字幕| 无码欧精品亚洲日韩一区| 日韩视频一区二区| 国产精品九九久久免费视频 | 国产精品嫩草影院线路|