Swoole的多进程模块

news2024/11/18 20:29:07

在这里插入图片描述
Swoole是有自己的一个进程管理模块,用来替代PHP的pcntl扩展,需要注意Process进程在系统是非常昂贵的资源,创建进程消耗很大,另外创建的进程过多会导致进程切换开销大幅上升。

为什么不使用pcntl

1.pcntl没有提供进程间通信的功能

2.pcntl不支持重定向标准输入和输出

3.pcntl只提供了fork这样原始的接口,容易使用错误

Swoole是怎么解决的

1.swoole_process提供了基于unixsock的进程间通信,使用很简单只需调用write/read或者push/pop即可

2.swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读键盘输入可以重定向为管道读取数据

3.swoole_process提供了exec接口,创建的进程可以执行其他程序,与原PHP父进程之间可以方便的通信

创建进程

函数原型:

Swoole\Process::__construct(callable $function, $redirect_stdin_stdout = false, $create_pipe = true)

如果我们打印$process会发现,每次创建一个进程后,就会随之创建一个管道,主进程想和哪一个进程通信,就向那个进程的管道写入/读取数据。

管道有2个方法,分别来写入数据,和读取数据。

$process->write(‘数据’);#写入数据
$process->read()#读取数据
管道通讯方式一:

$worker = [];
for ($i = 0; $i < 3; $i++) {
    $process = new Swoole\Process(function ($process) {
        var_dump('子进程:' . $process->read());
        sleep(1);
        $process->write('子进程数据');
        echo PHP_EOL . posix_getpid() . PHP_EOL;
    }, false, true);
    $pid = $process->start();
    $worker[$pid] = $process;//把相应的进程放到同一个数组当中
    $process->write('主进程数据');
//    var_dump($process->read());//同步阻塞
}
foreach ($worker as $w) {
    var_dump('主进程:' . $w->read());
}

管道通讯方式二:

for ($i = 0; $i < 3; $i++) {
    $process = new Swoole\Process(function ($process) {
        var_dump('子进程:' . $process->read());
        sleep(1);
        $process->write('子进程数据');
        echo PHP_EOL . posix_getpid() . PHP_EOL;
    }, false, true);
    $pid = $process->start();
    $process->write('主进程数据');
    // 异步监听管道中的数据,读事件监听,当管道可读时触发
    swoole_event_add($process->pipe, function ($pipe) use ($process) {
        var_dump('主进程:' . $process->read());
    });
//    var_dump($process->read());//同步阻塞
}

消息队列的通讯
消息队列:

一系列保存在内核中的消息链表
有一个 msgKey, 可以通过此访问不同的消息队列
有数据大小限制, 默认 8192
阻塞 vs 非阻塞: 阻塞模式下 pop()空消息队列/push()满消息队列会阻塞, 非阻塞模式可以直接返回
swoole 中使用消息队列:

通信模式: 默认为争抢模式, 无法将消息投递给指定子进程
新建消息队列后, 主进程就可以使用
消息队列不可和管道一起使用, 也无法使用 swoole event loop
步骤:

1.启用消息队列作为进程间通信:

bool swoole_process->useQueue(int $msgkey = 0, int $mode = 2);

2.投递数据到消息队列中:

bool swoole_process->push(string $data);

3.从队列中提取数据

string swoole_process->pop(int $maxsize = 8192);

案例:

for ($i = 0; $i < 3; $i++) {
    $process = new Swoole\Process(function ($process) {
        var_dump('子进程:' . $process->pop());
//        $process->push('hello 主进程');#推送到主进程
    });
    $process->useQueue(1, 2 | swoole_process::IPC_NOWAIT);//启用消息队列,争抢模式,非阻塞,可能会被任意一个子进程接收到
    $pid = $process->start();


    $process->push('hello 子进程');#推送到子进程,不能当做管道使用
//    echo '主进程消息:' . $process->pop() . PHP_EOL;
}

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

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

相关文章

AI智能眼镜_带摄像头的AI智能眼镜,AI大模型落地的载体

随着科技的迅猛发展&#xff0c;AI智能眼镜汇聚了众多硬件的优势&#xff0c;成为现代生活中不可或缺的一部分。这种创新设备不仅内嵌了耳机、摄像头以及WiFi和蓝牙模块等核心硬件&#xff0c;还具备了音频播放、图像拍摄和无线通信等多种功能&#xff0c;极大地提升了信息获取…

深度学习经典模型之BERT(上)

深度学习经典模型之BERT(下&#xff09; BERT(Bidirectional Encoder Representations from Transformers)是一个双向transformer编码器的言表示模型。来自论文&#xff1a;BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 。由Google公司的…

【WRF运行第二期(Ubuntu)】ARWpost安装及错误总结

WRF运行第二期&#xff1a;ARWpost安装及错误总结 1 ARWpost介绍2 ARWpost安装2.1 ARWpost_V3安装前准备2.2 安装ARWpost2.3 修改Makefile文件2.4 修改configure.arwp文件2.5 生成可执行文件EXE另&#xff1a;报错1-Error: Type mismatch between actual argument at (1) and a…

计算物理精解【3】- FORTRAN计算

文章目录 概述hello,world环境接收输入与输出 读取csv文件if and select case循环formatread,write formatread,write读写文件录入与读取数据文件定位csv 数组一维数组最小二乘法下标隐式循环 关系代数基本运算笛卡尔积投影选择 过程参数select case 和 过程module快排函数自定…

深度学习自编码器 - 分布式表示篇

序言 深度学习作为人工智能领域的重要分支&#xff0c;其核心在于表示学习&#xff08; Representation Learning \text{Representation Learning} Representation Learning&#xff09;&#xff0c;尤其是分布式表示&#xff08; Distributed Representation \text{Distribut…

【JUC并发编程系列】深入理解Java并发机制:高效并发背后的守护者(八、线程池的秘密)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;高效并发背后的守护者(八、线程池的秘密)1. 线程池基础知识1.1 什么是线程池1.2 为什么要使用线程池1.3 线程池使用场景1.4 线程池有哪些作用 2. 线程池基本用法2.1 线程池的创建方式2.2 线程池底层是如何实现复用…

前端vuex

需要共享的数据适合存储到vuex中 state基本使用 如果开启strict严格模式&#xff0c;直接修改上图的age会报错提示。不能在组件中直接修改state

“永辉优品”会是中国零售的答案吗?

投资者这么快就“看懂”名创优品的豪赌了&#xff1f; 9月25日&#xff0c;永辉超市继续一字涨停&#xff0c;而令人意外的是&#xff0c;名创优品也反弹近8%。 随着名创优品于9月23日晚间在港交所公告&#xff0c;以62.7亿人民币收购永辉超市29.4%的股权&#xff0c;两家公司…

数据科学的核心工具箱:全面解析pandas、matplotlib.pyplot与scipy.stats在复杂数据分析流程中的应用

在当今数据驱动的世界中&#xff0c;Python已成为数据分析和科学计算的首选语言。 而 pandas 、 matplotlib.pyplot 和 scipy.stats 这三个库则是数据科学家和分析师武器库中 的三把利剑。 1. pandas 数据处理的瑞士军刀 pandas 库是 Python数据分析 的基石&#xff0c;它…

Distilabel合成数据生成框架简明教程

Distilabel 是一个用于合成数据和 AI 反馈的框架&#xff0c;适用于需要基于经过验证的研究论文的快速、可靠和可扩展的管道的工程师。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 -…

SpringCloud~

帮你轻松入门SpringCloud~ 1 微服务概述 1.1什么是微服务 如idea中使用maven建立的一个个moudle&#xff0c;它具体是使用SpringBoot开发的一个小模块&#xff0c;专业的事交给专业的模块来做&#xff0c;每个模块完成一个具体的任务或功能。 1.2 什么是微服务架构 它将单一应用…

MyBatis 动态 SQL 使用指南

MyBatis 是一个流行的持久层框架&#xff0c;它通过 XML 或注解将接口方法与 SQL 映射在一起。动态 SQL 是 MyBatis 的一大特性&#xff0c;它使得构建灵活的查询变得简单。本文将通过一个 User 表的示例&#xff0c;介绍 MyBatis 中常用的动态 SQL 方法。 1. 什么是动态 SQL&…

飞驰云联亮相电子半导体数智化年会 获”数据交换领域最佳厂商”

2024年9月20日&#xff0c;“2024第二届电子半导体/智能制造数智化年会暨品牌出海论坛”于上海隆重开幕&#xff0c;Ftrans飞驰云联作为国内领先的数据安全交换厂商&#xff0c;应邀携半导体全场景产品和解决方案亮相此次峰会。会上进行了“智象奖”评选&#xff0c;Ftrans飞驰…

sql中的regexp与like区别

sql中的regexp与like区别 1、REGEXP2、LIKE3、区别与选择 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、REGEXP 用途&#xff1a;高级字符串匹配&#xff0c;使用正则表达式。特点&#xff1a;灵活性强&#xff0c;能进行复杂模式匹配…

Java项目实战II基于Java+Spring Boot+MySQL的汽车销售网站(文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化时…

【iOS】引用计数(一)

【iOS】引用计数 文章目录 【iOS】引用计数前言ARC与MRC什么是引用计数的机制内存管理的思考方式自己生成的对象非自己生成的对象不再需要自己持有就释放无法释放非自己持有的对象 autorelease小结 前言 笔者最近开始学习了一下有关于引用计数的内容&#xff0c;写这篇博客来简…

自动驾驶规划算法(一):A*算法原理和代码(c++与python)

1. A*算法简介 A*算法&#xff08;A-star algorithm&#xff09;诞生于1968年&#xff0c;由彼得哈特&#xff08;Peter Hart&#xff09;、尼尔森尼尔森&#xff08;Nils Nilsson&#xff09;和伯特拉波特&#xff08;Bertram Raphael&#xff09;三位计算机科学家提出。它的…

[机器学习]04-逻辑回归(python)-03-API与癌症分类案例讲解

逻辑回归&#xff08;Logistic Regression&#xff09; 的一API 介绍 关于如何配置模型中的优化器、正则化和惩罚项。 1. 逻辑回归 API 在 Scikit-learn 中&#xff0c;逻辑回归可以通过如下方式定义&#xff1a; from sklearn.linear_model import LogisticRegression ​ …

C嘎嘎入门篇:类和对象(1)

前言&#xff1a; 小编在之前讲述了C的部分入门基础&#xff0c;读者朋友一定要掌握好那些&#xff0c;因为C的学习和C有点不同&#xff0c;C的知识都是比较连贯的&#xff0c;所以我们学好了前面才可以学习后面的内容&#xff0c;本篇文章小编将会讲述C真正的入门篇&#xff1…

爬虫逆向学习(九):记录一个集cookie、请求参数、请求体、响应文本加密的站点反爬

此分享只用于学习用途&#xff0c;不作商业用途&#xff0c;若有冒犯&#xff0c;请联系处理 反爬前置信息 站点&#xff1a;aHR0cHM6Ly96d2Z3LmNxLmdvdi5jbi9pY2l0eS9pY2l0eS9lbmdpbmVlcmluZy9uYXZpZ2F0aW9u 接口&#xff1a;/icity/api-v2/cq.app.icity.engineering.Engine…