电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP swoole的process模塊創建和使用子進程操作示例

瀏覽:125日期:2022-09-11 09:44:38

本文實例講述了PHP swoole的process模塊創建和使用子進程操作。分享給大家供大家參考,具體如下:

swoole中為我們提供了一個進程管理模塊 Process,替換PHP的 pcntl 擴展,方便我們創建進程,管理進程,和進程間的通信。

swoole提供了2種進程間的通信:

1、基于 unix socket 的管道 pipe。

2、基于 sysvmsg 的消息隊列。

我們可以通過 new swoole_process() 快速的創建一個進程,默認會創建一個 SOCK_DGRAM 類型的管道,用于進程間的通信,當然可以設置成其他類型,也可以不創建。

一、通過同步阻塞管道進行進程間通信

<?php$worker_process_nums = 5;$worker_process = []; for ($i = 0; $i < $worker_process_nums; $i++) { //創建子進程 //默認為每個子進程創建一個管道,如果不想創建設置$pipe_type參數為false //注意管道默認是同步阻塞,半雙工,如果讀取不到數據就會阻塞 $worker = new swoole_process(function (swoole_process $worker) { //注意,如果主進程中不寫數據write(),那么子進程這里read()就會阻塞 $task = json_decode($worker->read(), true); //進行計算任務 $tmp = 0; for ($i = $task[’start’]; $i < $task[’end’]; $i++) { $tmp += $i; } echo ’子進程 PID : ’, $worker->pid, ’ 計算 ’, $task[’start’], ’ - ’, $task[’end’], ’ 結果 : ’, $tmp, PHP_EOL; //往管道中寫入計算的結果 $worker->write($tmp); //子進程退出 $worker->exit(); }); //保存子進程 $worker_process[$i] = $worker; //啟動子進程 $worker->start();} //往每個子進程管道中投遞任務for ($i = 0; $i < $worker_process_nums; $i++) { $worker_process[$i]->write(json_encode([ ’start’ => mt_rand(1, 10), ’end’ => mt_rand(50, 100), ]));} //父進程監聽子進程退出信號,回收子進程,防止出現僵尸進程swoole_process::signal(SIGCHLD, function ($sig) { //必須為false,非阻塞模式 while ($ret = swoole_process::wait(false)) { echo '子進程 PID : {$ret[’pid’]} 退出n'; }});

二、通過 swoole_event_add 將管道設為異步,來進行通信

<?php$worker_process_nums = 5;$worker_process = []; for ($i = 0; $i < $worker_process_nums; $i++) { $worker = new swoole_process(function ($worker) { //在子進程中給管道添加事件監聽 //底層會自動將該管道設置為非阻塞模式 //參數二,是可讀事件回調函數,表示管道可以讀了 swoole_event_add($worker->pipe, function ($pipe) use ($worker) { $task = json_decode($worker->read(), true); $tmp = 0; for ($i = $task[’start’]; $i < $task[’end’]; $i++) {$tmp += $i; } echo '子進程 : {$worker->pid} 計算 {$task[’start’]} - {$task[’end’]} n'; //子進程把計算的結果,寫入管道 $worker->write($tmp); //注意,swoole_event_add與swoole_event_del要成對使用 swoole_event_del($worker->pipe); //退出子進程 $worker->exit(); }); }); $worker_process[$i] = $worker; //啟動子進程 $worker->start();} for ($i = 0; $i < $worker_process_nums; $i++) { $worker = $worker_process[$i]; $worker->write(json_encode([ ’start’ => mt_rand(1, 10), ’end’ => mt_rand(50, 100), ])); //主進程中,監聽子進程管道事件 swoole_event_add($worker->pipe, function ($pipe) use ($worker) { $result = $worker->read(); echo '子進程 : {$worker->pid} 計算結果 {$result} n'; swoole_event_del($worker->pipe); });} //父進程監聽子進程退出信號,回收子進程,防止出現僵尸進程swoole_process::signal(SIGCHLD, function ($sig) { //必須為false,非阻塞模式 while ($ret = swoole_process::wait(false)) { echo '子進程 PID : {$ret[’pid’]} 退出n'; }});

三、使用消息隊列來完成進程間通信

<?php$worker_process_nums = 5;$worker_process = []; for ($i = 0; $i < $worker_process_nums; $i++) { //注意,這里將參數$pipe_type設為false,表示不創建管道 $worker = new swoole_process(function ($worker) { $task = json_decode($worker->pop(), true); $tmp = 0; for ($i = $task[’start’]; $i < $task[’end’]; $i++) { $tmp += $i; } echo '子進程 : {$worker->pid} 計算 {$task[’start’]} - {$task[’end’]} n'; $worker->push($tmp); $worker->exit(); }, false, false); //使用消息隊列,作為進程間的通信 //注意,消息隊列是共享的 $worker->useQueue(); $worker_process[$i] = $worker; //啟動子進程 $worker->start();} for ($i = 0; $i < $worker_process_nums; $i++) { //只需用一個子進程發送消息即可,因為消息隊列是共享的 $worker_process[0]->push(json_encode([ ’start’ => mt_rand(1, 10), ’end’ => mt_rand(50, 100), ]));} //注意,這里要暫停,防止加入隊列的任務,立刻被主進程讀出來。sleep(1); for ($i = 0; $i < $worker_process_nums; $i++) { $result = $worker_process[0]->pop(); echo '計算結果 : {$result} n';} //父進程監聽子進程退出信號,回收子進程,防止出現僵尸進程swoole_process::signal(SIGCHLD, function ($sig) { //必須為false,非阻塞模式 while ($ret = swoole_process::wait(false)) { echo '子進程 PID : {$ret[’pid’]} 退出n'; }});

四、進程可以通過 signal 監聽信號,和 alarm 設置定時器。

我們可以在父進程上設置監聽信號,當子進程退出時,重新掛起子進程。

也可以設置定時器,通過 swoole_process::kill($pid, 0); 定時檢測進程是否存活。

<?php//每隔1秒觸發SIGALAM信號//注意,alarm不能和Timer同時使用swoole_process::alarm(1000 * 1000, 0); swoole_process::signal(SIGALRM, function ($signo) { static $cnt = 0; $cnt++; echo '時鐘定時信號n'; if ($cnt > 10) { //清除定時器 swoole_process::alarm(-1); }}); swoole_process::signal(SIGINT, function ($signo) { echo '我被ctrl+c了n'; //退出主進程,不然將一直無法正常退出 exit(0);});

更多關于PHP相關內容感興趣的讀者可查看本站專題:《PHP網絡編程技巧總結》、《php socket用法總結》、《php面向對象程序設計入門教程》、《PHP數據結構與算法教程》及《php程序設計算法總結》

希望本文所述對大家PHP程序設計有所幫助。

標簽: PHP
相關文章:
主站蜘蛛池模板: 原子吸收设备-国产分光光度计-光谱分光光度计-上海光谱仪器有限公司 | 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 旅游规划_旅游策划_乡村旅游规划_景区规划设计_旅游规划设计公司-北京绿道联合旅游规划设计有限公司 | 屏蔽服(500kv-超高压-特高压-电磁)-徐吉电气 | 鲁网 - 山东省重点新闻网站,山东第一财经门户| 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 小型单室真空包装机,食品单室真空包装机-百科| 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 杭州ROHS检测仪-XRF测试仪价格-百科| 桑茶-七彩贝壳桑叶茶 长寿茶 | hc22_hc22价格_hc22哈氏合金—东锜特殊钢| 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | 南京交通事故律师-专打交通事故的南京律师 | 颗粒机,颗粒机组,木屑颗粒机-济南劲能机械有限公司 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 酒瓶_酒杯_玻璃瓶生产厂家_徐州明政玻璃制品有限公司 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | CPSE安博会| 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 100_150_200_250_300_350_400公斤压力空气压缩机-舰艇航天配套厂家 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 淄博不锈钢,淄博不锈钢管,淄博不锈钢板-山东振远合金科技有限公司 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 螺杆真空泵_耐腐蚀螺杆真空泵_水环真空泵_真空机组_烟台真空泵-烟台斯凯威真空 | 混合生育酚_醋酸生育酚粉_琥珀酸生育酚-山东新元素生物科技 | 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 药品/药物稳定性试验考察箱-埃里森仪器设备(上海)有限公司 | 桐城新闻网—桐城市融媒体中心主办 |