php进程间通信 yoc_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);

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

PHP进阶架构师>>>视频、面试文档免费获取​shimo.im
7e38b8b18492f708236a02bbeba03b69.png

或 者关注咱们下面的知乎专栏

PHP7进阶架构师​zhuanlan.zhihu.com
49c100a1a18299f026c734d7e36da170.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax回复留言,Ajax 留言板模拟

这一节我们利用 Ajax 制作一个留言板模拟&#xff0c;之所以叫模拟&#xff0c;是由于没有将留言内容存入数据库&#xff0c;而只是假像地处理&#xff0c;因为这里着重讨论 Ajax&#xff0c;暂时就不涉及数据库操作。这里我们模拟了留言失败的情况&#xff0c;每次提交有 50% …

RabbitMQ:计划邮件传递

本月初&#xff0c;我在ComoRichWeb上的RabbitMQ上做了一个演讲&#xff0c;与会人员提出的一个问题是“是否可以发布一条消息供以后使用&#xff1f;” 我回答说&#xff0c;就我所知&#xff0c;这是不可能的&#xff0c;但是可能会有一些技巧来实现它。 好吧&#xff0c;今天…

mysqls压力测试怎么用_阿里研究员:测试稳定性三板斧,我怎么用?

阿里妹导读&#xff1a;如何治理测试稳定性问题&#xff1f;很多人会说&#xff1a;环境、流程管控、监控、工具化、加机器、专人负责、等等。这些都是对的。不过这些都是解决方案层面的&#xff0c;而不是方法论和理论体系层面的。今天&#xff0c;阿里研究员郑子颖来说说测试…

HttpModule与HttpHandler详解

ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&…

【iOS开发】---- 强大的UI修改工具 UIAppearance-有图片效果

iOS5及其以后提供了一个比较强大的工具UIAppearance&#xff0c;可以轻松的统一你的界面&#xff0c;它提供如下两个方法&#xff1a; (id)appearance (id)appearanceWhenContainedIn:(Class <>)ContainerClass,... 第一个方法是统一全部改&#xff0c;比如你设置UINav…

7月9日王者荣耀服务器维护,王者荣耀 7月9日体验服停机更新公告

亲爱的召唤师&#xff1a;为了增加版本的稳定性&#xff0c;我们计划在2021年7月9日16:00-17:00对《王者荣耀》体验服进行停机维护。【更新时间】7月9日16:00-17:00(15:30关闭PVP)【更新方式】停机更新【更新范围】王者荣耀修炼之地体验服【下载地址】体验服更新完毕后&#xf…

使用Jetty设置JNDI(嵌入式)

我在开发工作区上运行嵌入式Jetty&#xff0c;从而节省了一些编译和部署恶性循环的时间。 我与Jetty的合作不多&#xff0c;易用性使我着迷于它。 我需要设置JNDI才能检索与数据库相关的活动的连接池。 尽管某些地方有完整的文档&#xff0c;但大多数都是分散的。 因此&#xf…

交华为换机access配置_华为交换机Hybrid接口及基础配置

一、回顾VLANVLAN基本概念VLAN即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域(多个VLAN)的通信技术。VLAN内的主机间可以直接通信&#xff0c;而VLAN间不能直接互通&#xff0c;从而将广播报文限制在一个VLAN内。由于VLAN之间的隔离&#xff0c;所以一些类…

HttpClient使用之下载远程服务器中的文件(注意目录遍历漏洞)

参考文献&#xff1a; http://bbs.csdn.net/topics/390952011 http://blog.csdn.net/ljj_9/article/details/53306468 1.下载地址 http://hc.apache.org/downloads.cgi Apache-》Projects-》HttpComponents 2.DownloadServlet 1 package com.servlet;2 3 import java.io.Buffer…

HDOJ-1263

水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5303 Accepted Submission(s): 2022 Problem Description夏天来了~~好开心啊,呵呵,好多好多水果~~Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾…

django ajax form表单,Django学习系列之Form表单和ajax(示例代码)

昵 称&#xff1a;生 日&#xff1a;性 别&#xff1a; 男 女地 址&#xff1a;手 机 号&#xff1a;邮 箱&#xff1a;[修改]{% csrf_token %}$(\#jsEditUserBtn\).on(\click\, function(){var _self $(this),$jsEditUserForm $(\#…

git push 的符号笔有什么用_如何同步多个 git 远程仓库

点击上方“后端技术精选”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;taadismy.oschina.net/taadis/blog/3073220题外话&#xff0c;开发中遇到问题或者学习新技术时缺少交流环境&#xff0c;可以点击加入【后端技术交流群】日常需求以前…

Java EE重新审视设计模式:观察者

除了以多种语言和许多应用程序实现之外&#xff0c;Observer Pattern自1.0版以来一直是Java的一部分。 观察者模式也是好莱坞原则的良好实施。 就像好莱坞的特工喜欢回调候选人以代替某个职位&#xff0c;而不是每天被要求询问可用工作一样&#xff0c;大多数服务器端资源&…

POI搜索简介

用户输入——用户输出-----------------------------------------------------------而POI搜索引擎&#xff0c;需要做的就是拿到输入条件&#xff0c;给出用户比较满意的结果。用户角度&#xff1a;输入&#xff1a;尽量简单&#xff0c;且符合心意输入时的假设&#xff1a;假…

2、Spring的 IoC详解(第一个Spring程序)

Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转&#xff08;IoC&#xff09;和面向切面&#xff08;AOP&#xff09;的容器框架。在这句话中重点有两个&#xff0c;一个是IoC&#xff0c;另一个是AOP。今天我们讲第一个IoC。 一. IoC理论的背景 我们都知道…

排除服务器简单系统故障方法,引导CD排除服务器故障方法有哪些?

尽管Linux系统以稳定可靠著称&#xff0c;但由于硬件问题有时仍会崩溃/或无法引。针对这一问题&#xff0c;最好的解决办法就是使用Linux系统引导CD。为了方便读者&#xff0c;笔者在下面列出了安装Red Hat Linux 8。0的最必须步骤。为安装过程作笔记在Red Hat Linux系统典型安…

js 获取father_(原创)Node.JS实战26:强大的工作池。收藏吧!你一定会用的到。...

在实际项目中&#xff0c;如果遇到需要大计算量的操作&#xff0c;按需fork&#xff08;分叉&#xff09;其实不是一个好的选择。因为fork的子进程也是V8&#xff08;NodeJS的核心引擎&#xff09;的新实例&#xff0c;每创建一个新实例&#xff0c;需要约30毫秒启动时间&#…

具有ReadWriteLock的Java并发

编写多线程Java应用程序并不是小菜一碟。 必须格外小心&#xff0c;因为同步不良会使您的应用程序一s不振。 JVM堆由所有线程共享。 如果多个线程需要同时使用相同的对象或静态类变量&#xff0c;则必须谨慎管理对共享数据的线程访问。 从1.5版开始&#xff0c;JSDK中包含了在并…

修复steam服务器失败,steam服务器链接失败

steam服务器链接失败 内容精选换一换当NTP服务器异常时产生该告警。当NTP服务器异常消除时&#xff0c;该告警恢复。主OMS节点配置的NTP服务器异常&#xff0c;可能会导致主OMS节点与外部服务器不能同步时间&#xff0c;集群时间可能会产生飘移。NTP服务器网络异常。与NTP服务器…

qemu-kvm简单使用

qemu-kvm主要有以下几个选项: -snapshot: 创建快照-m: 指定内存大小-smp: 指定处理器个数-cpu: 指定CPU类型-name: 设置虚拟机名称-vnc: 使用vnc连接-boot: 指定启动相关的选项-net: 指定网卡相关的选项-drive: 指定硬盘/光盘相关的选项qemu-kvm -m 128 -name first -smp 2 -dr…