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

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

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

瀏覽:123日期: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
相關文章:
主站蜘蛛池模板: 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 | 美名宝起名网-在线宝宝、公司、起名平台| 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器 | 海鲜池-专注海鲜鱼缸、移动海鲜缸、饭店鱼缸设计定做-日晟水族厂家 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 派财经_聚焦数字经济内容服务平台 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 陕西自考报名_陕西自学考试网 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | 美甲贴片-指甲贴片-穿戴美甲-假指甲厂家--薇丝黛拉 | 葡萄酒灌装机-食用油灌装机-液体肥灌装设备厂家_青州惠联灌装机械 | 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 喷涂流水线,涂装流水线,喷漆流水线-山东天意设备科技有限公司 | 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 |