摘要:在版本中我們將的進(jìn)程管理模塊封裝成了類,現(xiàn)在可以在代碼中使用的進(jìn)程管理器了。提供的進(jìn)程管理器來自于,經(jīng)過大量生產(chǎn)項(xiàng)目驗(yàn)證,穩(wěn)定性和健壯性都非常高。三任務(wù)投遞進(jìn)程管理器自帶了消息隊(duì)列和消息投遞的支持。
在Swoole-2.1.2版本中我們將Server的進(jìn)程管理模塊封裝成了PHP類,現(xiàn)在可以在PHP代碼中使用Swoole的進(jìn)程管理器了。
在實(shí)際項(xiàng)目中經(jīng)常需要寫一些長(zhǎng)期運(yùn)行的腳本,如基于redis、kafka、rabbitmq實(shí)現(xiàn)的多進(jìn)程隊(duì)列消費(fèi)者,多進(jìn)程爬蟲等等。程序員需要使用pcntl和posix相關(guān)的擴(kuò)展庫實(shí)現(xiàn)多進(jìn)程編程,需要開發(fā)者具備深厚的Linux系統(tǒng)編程功底,否則很容易出現(xiàn)問題。
Swoole提供的進(jìn)程管理器來自于SwooleServer,經(jīng)過大量生產(chǎn)項(xiàng)目驗(yàn)證,穩(wěn)定性和健壯性都非常高??纱蟠蠛?jiǎn)化多進(jìn)程腳本編程工作。
一、 創(chuàng)建進(jìn)程池在PHP代碼中使用new SwooleProcessPool即可創(chuàng)建一個(gè)進(jìn)程池,構(gòu)造方法的第一個(gè)參數(shù)傳入工作進(jìn)程的數(shù)量。使用on方法設(shè)置WorkerStart即可在工作進(jìn)程啟動(dòng)時(shí)執(zhí)行指定的代碼,可以在這里進(jìn)行while(true)循環(huán)從redis隊(duì)列中獲取任務(wù)并處理。使用start方法啟動(dòng)所有進(jìn)程,管理器開始進(jìn)入wait狀態(tài)。
$workerNum = 10; $pool = new SwooleProcessPool($workerNum); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started "; $redis = new Redis(); $redis->pconnect("127.0.0.1", 6379); $key = "key1"; while (true) { $msgs = $redis->brpop($key, 2); if ( $msgs == null) continue; var_dump($msgs); } }); $pool->on("WorkerStop", function ($pool, $workerId) { echo "Worker#{$workerId} is stopped "; }); $pool->start();
使用進(jìn)程管理器,可以保證工作進(jìn)程的穩(wěn)定性。
某個(gè)工作進(jìn)程遇到致命錯(cuò)誤、主動(dòng)退出時(shí)管理器會(huì)進(jìn)行回收,避免出現(xiàn)僵尸進(jìn)程
工作進(jìn)程退出后,管理器會(huì)自動(dòng)拉起、創(chuàng)建一個(gè)新的工作進(jìn)程
二、信號(hào)處理Swoole進(jìn)程管理器自帶了信號(hào)處理,向管理器進(jìn)程發(fā)送:
SIGTERM信號(hào):中止服務(wù),向所有工作進(jìn)程發(fā)送SIGTERM關(guān)閉進(jìn)程
SIGUSR1信號(hào):重啟工作進(jìn)程,管理器會(huì)逐個(gè)重啟工作進(jìn)程
在工作進(jìn)程中可以配合使用pcntl_signal和pcntl_signal_dispatch實(shí)現(xiàn)信號(hào)處理。
$pool->on("WorkerStart", function ($pool, $workerId) { $running = true; pcntl_signal(SIGTERM, function () use (&$running) { $running = false; }); echo "Worker#{$workerId} is started "; $redis = new Redis(); $redis->pconnect("127.0.0.1", 6379); $key = "key1"; while ($running) { $msgs = $redis->brpop($key, 2); pcntl_signal_dispatch(); if ( $msgs == null) continue; var_dump($msgs); } });三、任務(wù)投遞
Swoole進(jìn)程管理器自帶了消息隊(duì)列和TCP-Socket消息投遞的支持??稍O(shè)置監(jiān)聽系統(tǒng)隊(duì)列或者TCP端口,接收任務(wù)數(shù)據(jù)。此項(xiàng)功能是可選的,要使用任務(wù)投遞功能,需要對(duì)進(jìn)程池對(duì)象設(shè)置onMessage回調(diào)。
消息隊(duì)列$pool = new SwooleProcessPool(2, SWOOLE_IPC_MSGQUEUE, 0x7000001); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started "; }); $pool->on("Message", function ($pool, $message) { echo "Message: {$message} "; }); $pool->start();
需要在構(gòu)造方法的第二個(gè)參數(shù)傳入SWOOLE_IPC_MSGQUEUE,第三個(gè)參數(shù)設(shè)置監(jiān)聽的消息隊(duì)列KEY。其他程序中使用消息隊(duì)列相關(guān)API就可以向工作進(jìn)程投遞任務(wù)了。
TCP 端口$pool = new SwooleProcessPool(2, SWOOLE_IPC_SOCKET); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started "; }); $pool->on("Message", function ($pool, $message) { echo "Message: {$message} "; }); $pool->listen("127.0.0.1", 8089); $pool->start();
使用TCP端口監(jiān)聽,需要設(shè)置構(gòu)造方法的第二個(gè)參數(shù)為SWOOLE_IPC_SOCKET,并使用listen方法設(shè)置監(jiān)聽的主機(jī)和端口。
底層使用了4字節(jié)長(zhǎng)度+包體的協(xié)議。其他程序中向此端口發(fā)送數(shù)據(jù)時(shí),需要在數(shù)據(jù)包之前增加一個(gè)長(zhǎng)度字段。
$fp = stream_socket_client("tcp://127.0.0.1:8089", $errno, $errstr) or die("error: $errstr "); $msg = json_encode(["data" => "hello", "uid" => 1991]); fwrite($fp, pack("N", strlen($msg)).$msg); fclose($fp);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/28568.html
摘要:請(qǐng)求的多階段異步處理多階段異步處理請(qǐng)求與事件驅(qū)動(dòng)架構(gòu)是密切相關(guān)的,也就是說,請(qǐng)求的多階段異步處理只能基于事件驅(qū)動(dòng)架構(gòu)實(shí)現(xiàn)。 前言 最近在讀 Nginx 相關(guān)的書籍,做一下讀書筆記。 Nginx 作為業(yè)界知名的高性能服務(wù)器,被廣泛的應(yīng)用。它的高性能正是由于其優(yōu)秀的架構(gòu)設(shè)計(jì),其架構(gòu)主要包括這幾點(diǎn):模塊化設(shè)計(jì)、事件驅(qū)動(dòng)架構(gòu)、請(qǐng)求的多階段異步處理、管理進(jìn)程與多工作進(jìn)程設(shè)計(jì)、內(nèi)存池的設(shè)計(jì),以下內(nèi)...
摘要:請(qǐng)求的多階段異步處理多階段異步處理請(qǐng)求與事件驅(qū)動(dòng)架構(gòu)是密切相關(guān)的,也就是說,請(qǐng)求的多階段異步處理只能基于事件驅(qū)動(dòng)架構(gòu)實(shí)現(xiàn)。 前言 最近在讀 Nginx 相關(guān)的書籍,做一下讀書筆記。 Nginx 作為業(yè)界知名的高性能服務(wù)器,被廣泛的應(yīng)用。它的高性能正是由于其優(yōu)秀的架構(gòu)設(shè)計(jì),其架構(gòu)主要包括這幾點(diǎn):模塊化設(shè)計(jì)、事件驅(qū)動(dòng)架構(gòu)、請(qǐng)求的多階段異步處理、管理進(jìn)程與多工作進(jìn)程設(shè)計(jì)、內(nèi)存池的設(shè)計(jì),以下內(nèi)...
摘要:限制同時(shí)運(yùn)行線程數(shù)使用類就行,在內(nèi)部管理著一個(gè)計(jì)數(shù)器。當(dāng)計(jì)數(shù)器到時(shí),再調(diào)用就會(huì)阻塞,直到其他線程來調(diào)用,這樣就限制了同時(shí)運(yùn)行線程的數(shù)量。 事前最好了解一下什么是進(jìn)程,什么是線程,什么是GIL,本文不再贅述,直接介紹模塊的使用: 推薦1,推薦2,推薦3,更多自尋 普通的python爬蟲是單進(jìn)程單線程的,這樣在遇到大量重復(fù)的操作時(shí)就只能逐個(gè)進(jìn)行,我們就很難過了。舉個(gè)栗子:你有1000個(gè)...
摘要:最近看前端都展開了幾場(chǎng)而我大知乎最熱語言還沒有相關(guān)。有關(guān)書籍的介紹,大部分截取自是官方介紹。但從開始,標(biāo)準(zhǔn)庫為我們提供了模塊,它提供了和兩個(gè)類,實(shí)現(xiàn)了對(duì)和的進(jìn)一步抽象,對(duì)編寫線程池進(jìn)程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進(jìn)階的書, 里面介紹的基本都是高級(jí)的python用法. 對(duì)于初學(xué)python的人來說, 基礎(chǔ)大概也就夠用了...
閱讀 1380·2021-11-24 10:24
閱讀 4422·2021-11-22 15:29
閱讀 1152·2019-08-30 15:53
閱讀 2861·2019-08-30 10:54
閱讀 2053·2019-08-29 17:26
閱讀 1379·2019-08-29 17:08
閱讀 673·2019-08-28 17:55
閱讀 1671·2019-08-26 14:01