Swoole-2.1.2 进程池模块的使用
在?Swoole-2.1.2?
版本中我們將?Server?
的?進(jìn)程?管理?模塊封裝成了?PHP?
類,現(xiàn)在可以在?PHP?
代碼?中使用?Swoole?
的進(jìn)程管理器了。
在實際項目中經(jīng)常需要寫一些長期運(yùn)行的腳本,如基于?redis?
、?kafka?
、?rabbitmq?
實現(xiàn)的多進(jìn)程隊列消費(fèi)者,多進(jìn)程爬蟲等等。?程序員?需要使用?pcntl?
和?posix?
相關(guān)的擴(kuò)展庫實現(xiàn)多進(jìn)程編程,需要?開發(fā)者?具備深厚的?Linux?
系統(tǒng)編程功底,否則很容易出現(xiàn)問題。
Swoole?
提供的進(jìn)程管理器來自于?Swoole/Server?
,經(jīng)過大量生產(chǎn)項目驗證,穩(wěn)定性和健壯性都非常高。可大大簡化多進(jìn)程腳本編程工作。
一、 創(chuàng)建進(jìn)程池
在?PHP?
代碼中使用?new?Swoole/Process/Pool?
即可創(chuàng)建一個進(jìn)程池,構(gòu)造方法的第一個?參數(shù)?傳入工作進(jìn)程的數(shù)量。使用?on?
方法設(shè)置?WorkerS?tar?t?
即可在工作進(jìn)程啟動時執(zhí)行指定的代碼,可以在這里進(jìn)行?while(true)?
循環(huán)從?redis?
隊列中獲取任務(wù)并處理。使用?start?
方法啟動所有進(jìn)程,管理器開始進(jìn)入?wait?
狀態(tài)。
使用進(jìn)程管理器,可以保證工作進(jìn)程的穩(wěn)定性。
- 某個工作進(jìn)程遇到致命錯誤、主動退出時管理器會進(jìn)行回收,避免出現(xiàn)僵尸進(jìn)程
- 工作進(jìn)程退出后,管理器會自動拉起、創(chuàng)建一個新的工作進(jìn)程
二、信號處理
Swoole?
進(jìn)程管理器自帶了信號處理,向管理器進(jìn)程發(fā)送:
- SIGTERM?
信號:中止服務(wù),向所有工作進(jìn)程發(fā)送?SIGTERM?
關(guān)閉進(jìn)程 - SIGUSR1?
信號:重啟工作進(jìn)程,管理器會逐個重啟工作進(jìn)程
在工作進(jìn)程中可以配合使用?pcntl_signal?
和?pcntl_signal_dispatch?
實現(xiàn)信號處理。
三、任務(wù)投遞
Swoole?
進(jìn)程管理器自帶了?消息隊列?和?TCP?-Socket?
消息投遞的支持。可設(shè)置監(jiān)聽系統(tǒng)隊列或者?TCP?
端口?,接收任務(wù)?數(shù)據(jù)?。此項功能是可選的,要使用任務(wù)投遞功能,需要對進(jìn)程池對象設(shè)置?onMessage?
回調(diào)。
消息隊列
$pool = new Swoole/Process/Pool(2, SWOOLE_IPC_MSGQUEUE, 0x7000001);$pool->on("Message", function ($pool, $message) {echo "Message: {$message}/n"; });$pool->start();需要在構(gòu)造方法的第二個參數(shù)傳入?SWOOLE_IPC_MSGQUEUE?
,第三個參數(shù)設(shè)置監(jiān)聽的消息隊列?KEY?
。其他程序中使用消息隊列相關(guān)?API?
就可以向工作進(jìn)程投遞任務(wù)了。
TCP 端口
$pool = new Swoole/Process/Pool(2, SWOOLE_IPC_SOCKET); $pool->on("Message", function ($pool, $message) {echo "Message: {$message}/n"; }); $pool->listen('127.0.0.1', 8089); $pool->start();使用?TCP?
端口監(jiān)聽,需要設(shè)置構(gòu)造方法的第二個參數(shù)為?SWOOLE_IPC_SOCKET?
,并使用?listen?
方法設(shè)置監(jiān)聽的?主機(jī)?和端口。
底層使用了?4?
字節(jié)長度+包體的?協(xié)議?。其他程序中向此端口發(fā)送數(shù)據(jù)時,需要在數(shù)據(jù)包之前增加一個長度字段。
原文
https?://segmentfault.com/a/1190000014303621
本站部分文章源于互聯(lián)網(wǎng),本著傳播知識、有益學(xué)習(xí)和研究的目的進(jìn)行的轉(zhuǎn)載,為網(wǎng)友免費(fèi)提供。如有著作權(quán)人或出版方提出異議,本站將立即刪除。如果您對文章轉(zhuǎn)載有任何疑問請告之我們,以便我們及時糾正。?PS:如果您想和業(yè)內(nèi)技術(shù)大牛交流的話,請加qq群(474807195)或者關(guān)注微信公眾號(AskHarries),謝謝!轉(zhuǎn)載請注明原文出處:?Harries Blog????Swoole-2.1.2 進(jìn)程池模塊的使用
來源:http://ju.outofmemory.cn/entry/350679
總結(jié)
以上是生活随笔為你收集整理的Swoole-2.1.2 进程池模块的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 送人的购物卡怎么办理
- 下一篇: 海尔智家有哪些产品 不仅提供家电