php cli 多进程编程

前言

php cli 命令模式我想在日常开发中,大家用的都比较少。其实,在某些场景,cli命令真的很有作用,

我举个例子

在mysql数据库的某个表tab1中数据量有3000W+条数据,现在需要对这张表中的每一条数据做计算处理。将处理的结果放置在新表tab2上,因为数据量很大,我想大家不会采用php-fpm模式去处理这个吧,肯定还是要cli,并将执行时间设置为长时执行(set_time_limit(0))。经测试,单条数据处理耗时3s左右。那么3000W+ * 3 = 9000W 多秒的时间才能计算完全部的数据,这个时间是运营无法接受的。那么我们的想法肯定是单进程处理改为多进程处理。将计算量分摊到多个进程上处理达到优化的目的。 那么我们怎么来设计呢。

程序设计

封装 - php - swoole_proccess 多进程模块

<?phpclass ProcessPool{private $process;/*** Worker 进程数组* @var array*/private $process_list = [];/*** 正在被使用的进程* @var array*/private $process_use = [];/*** 最少进程数量* @var int*/private $min_worker_num = 3;/*** 最多进程数量* @var int*/private $max_worker_num = 6;/*** 当前进程数量* @var int*/private $current_num;/*** @var callable 闭包待执行函数*/public $callable;public function __construct($callable,$max_worker_num = 6){$this->callable = $callable;$this->max_worker_num = $max_worker_num;$this->process = new swoole_process(array($this, 'run'), false, 2);$this->process->start();swoole_process::wait();}public function run(){$this->current_num = $this->min_worker_num;//建立全部的worker进程for($i = 0; $i < $this->current_num; $i++){$process = new swoole_process(array($this, 'task_run'), false, 2);$pid = $process->start();$this->process_list[$pid] = $process;$this->process_use[$pid] = 0;}foreach($this->process_list as $process){swoole_event_add($process->pipe, function ($pipe) use ($process){$data = $process->read();
//                var_dump($data . '空闲');//接收子进程处理完成的信息,而且重置为空闲$this->process_use[$data] = 0;});}//每秒定时向worker管道投递任务swoole_timer_tick(1000 ,function ($timer_id){static $index = 0;$index = $index + 1;$flag = true; //是否新建workerforeach ($this->process_use as $pid => $used){if($used == 0){$flag = false;//标记为正在使用$this->process_use[$pid] = 1;// 在父进程内调用write,子进程能够调用read接收此数据$this->process_list[$pid]->write($index);break;}}if($flag && $this->current_num < $this->max_worker_num){//没有闲置worker,新建worker来处理$process = new swoole_process(array($this, 'task_run'), false, 2);$pid = $process->start();$this->process_list[$pid] = $process;$this->process_use[$pid] = 1;$this->process_list[$pid]->write($index);$this->current_num++;}
//            var_dump('第' .$index. '个任务');if($index >= ($this->max_worker_num + 1)){foreach($this->process_list as $process){$process->write("exit");}swoole_timer_clear($timer_id);$this->process->exit();}});}/*** 子进程处理* @param $worker*/public function task_run($worker){swoole_event_add($worker->pipe, function($pipe) use($worker){$data = $worker->read();
//            var_dump($worker->pid . ':' . $data);if($data == 'exit'){$worker->exit();exit;}//模拟耗时任务//            sleep(5);call_user_func($this->callable,$worker,$data);//告诉主进程处理完成//在子进程内调用write,父进程能够调用read接收此数据$worker->write($worker->pid);});}
}

对数据量进行分摊,交给不同的进程处理。比如进程1处理0-200W的数据,进程2处理200W-300W的数据,依次类推。并做好日志记录,记录哪些处理失败了,原因是什么,方便后期针对性处理。

<?php$count = 30000000;//3000W   数据总量$secNum = 2000000;  //200W  每个进程要处理的数据量$maxWorkNum = intval(ceil($count / $secNum));$processPool = new ProcessPool(function(\Swoole\Process $worker,$index) use($maxWorkNum,$secNum){//index 为进程编号从1开始计数;work为进程对象$start = (($index-1) * $secNum) + 1;$end   = $index > $maxWorkNum ? 0 : $index * $secNum;//开始任务$companyJob = new CompanyRelationshipJob($start,$end,$index);$companyJob->run();},$maxWorkNum);

总结

当遇到数据量大的业务场景,我们需要考虑怎么将数据量均摊给多个进程处理,利用多核cpu的优势加快数据的处理满足业务需求。

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

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

相关文章

设计模式(含7大原则)面试题

目录 主要参考文章 设计模式的目的 设计模式的七大原则 设计模式的三大分类及关键点 1、创建型模式(用于解耦对象的实例化过程) 2、结构型模式 3、行为型模式 23种设计模式(乱序--现学现写,不全面--应付面试为主) 单例模式 模板模式 哈哈哈哈哈 声明 此文只针…

策略模式代码示例(二)

一、定义 策略模式&#xff0c;针对每一个不同的类型&#xff0c;调用具有共同接口的不同实现类&#xff0c;从而使得它们可以相互替换。 策略模式 &#xff0c;针对实现同一接口的不同的类&#xff0c;采用不同的策略。比如&#xff0c;面对高级会员、初级会员会采用不同的折…

详解字符串函数<string.h>(下)

1. strncpy函数的使用和模拟实现 char* strncpy(char* destination, const char* source, size_t num) 1.1 函数功能以及用法 拷贝指定长度的字符串 将“source”指向的字符串中的“num”个字符拷贝到“destination”指向的字符数组中。相比于strcpy函数&#xff0c;该函数多…

SQL语言的五大分类 (DQL、DDL、DML、DCL、TCL)

目录 一、DQL 二、DDL 三、DML 四、DCL 五、TCL 一、DQL&#xff08;数据查询语言&#xff09; Data Query Language&#xff0c;数据查询语言&#xff1a; select&#xff1a;用于数据查询 关键字&#xff1a;SELECT ... FROM ... WHERE 二、DDL&#xff08;数据定义语…

swift 长按桌面图标弹出快捷选项

文章目录 一、3D Touch二、主屏交互1. 静态添加2. 动态添加三、监听主屏交互按钮的点击事件四、预览和跳转1. 注册3D touch2. 实现协议3. 在目标控制器复写previewActionItems4. 使用UIContextMenuConfiguration一、3D Touch 3D Touch通过屏幕下方的压力感应器来感知不同的压力…

Cesium地表透明

之前Cesium是不能地表透明的&#xff0c;需要改内部代码&#xff0c;将GlobeSurfaceTileProvider.js中的PASS.GLOBE改成PASS.TRANSPARENT&#xff0c;通过将地表的drawCommand放到透明队列里渲染。现在发现有了新的方法&#xff08;其实2020年就有该方法了&#xff09;&#xf…

数据库管理-第157期 Oracle Vector DB AI-08(20240301)

数据库管理157期 2024-03-01 数据库管理-第157期 Oracle Vector DB & AI-08&#xff08;20240301&#xff09;1 创建示例向量2 查找最近向量3 基于向量簇组的最近向量查询总结 数据库管理-第157期 Oracle Vector DB & AI-08&#xff08;20240301&#xff09; 作者&…

【axiox】前后端接口通讯数据交互

重要全局配置&#xff1a; axios.create(); 设置axios请求的公共配置信息。 service.interceptors.request.use((config)>{}) 请求拦截器 service.interceptors.response.use((res)>{},(err)>{}) 响应拦截器 const source axios.CancelToken.source(); 用…

oracle RAC节点重构

一、清除集群上二节点的节点信息 1、删除实例 dbca或静默&#xff1a; [oraclerac1 ~]$ dbca -silent -deleteinstance -nodelist rac2 -gdbname orcl -instancename orcl2 -sysdbausername sys -sysdbapassword oracledbca-实例管理-删除节实例-选择服务输入密码-选择inactiv…

基于小波神经网络的数据分类算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 1.程序功能描述 基于小波神经网络的数据分类算法。输入为5个特征值&#xff0c;输出为判断&#xff08;是&#xff0c;否&#xff09;。拿50组数据对本算法作为训练组&#xff0c;后30组数据作…

B树、B+树、红黑树的定义、之间的区别、优缺点、数据结构、应用等

目录 B树 定义 数据结构 优点 缺点 应用 B树 定义 数据结构 优点 缺点 应用 红黑树 定义 数据结构 优点 缺点 应用 B树与B树与红黑树的区别 B树 定义 B树是一种自平衡的多路搜索树&#xff0c;它可以有多个子节点&#xff0c;不同于二叉树的是&#xff0c;一…

深入学习NumPy库在数据分析中的应用场景

在数据科学与机器学习领域&#xff0c;NumPy&#xff08;Numerical Python&#xff09;是一个经常被提及的重要工具。它是Python语言中一个非常强大的库&#xff0c;提供了高性能的多维数组对象以及用于处理这些数组的工具。NumPy不仅仅是一个用于数值计算的库&#xff0c;它还…

【PCB】用透明胶带制作印制板

用透明胶带作保护层来制作印制电路的方法&#xff0c;简单实用&#xff0c;作出的电路板质量较好&#xff0c;具体作法如下&#xff1a; &#xff08;1&#xff09;裁下一块敷铜板&#xff0c;用水磨砂纸将其四周毛刺磨平&#xff0c;用去污粉处理敷铜板表面上的污垢&#xff…

基于粒子群优化算法的图象聚类识别matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于粒子群优化算法的图象聚类识别。通过PSO优化方法&#xff0c;将数字图片的特征进行聚类&#xff0c;从而识别出数字0~9. 2.测试软件版本以及运行结果展示 M…

Hadoop之HDFS——【模块一】元数据架构

一、元数据是什么 在HDFS中,元数据主要指的是文件相关的元数据,通过两种形式来进行管理维护,第一种是内存,维护集群数据的最新信息,第二种是磁盘,对内存中的信息进行维护与持久化,由namenode管理维护。从广义的角度来说,因为namenode还需要管理众多的DataNode结点,因…

【测试开发面试复习(一)】计算机网络:应用层详解(P2)补充ing

复习自用&#xff0c;若有错漏&#xff0c;欢迎一起交流一下~~ 一、高频面试题记录 uri 和 url 的区别 &#xff1f; dns 是啥工作原理&#xff0c;主要解析过程是啥&#xff1f; 用户输入网址到显示对应页面的全过程是啥&#xff1f; http 头部包含哪些信息&#xff1f; http…

IEEE Trans. On Robotics ​“受护理人员启发的双臂机器人穿衣”研究工作

开发能够协助穿衣的辅助机器人&#xff0c;可以极大地改善老年人和残疾人的生活。然而&#xff0c;大多数机器人穿衣策略只考虑使用单个机器人&#xff0c;这大大限制了穿衣辅助的性能。事实上&#xff0c;专业护理人员是通过双臂来完成这项任务的。受其启发&#xff0c;我们提…

【YOLO v5 v7 v8 小目标改进】Non-local 注意力实现非局部神经网络,解决长空间和时间数据依赖问题

Non-local 注意力实现非局部神经网络&#xff0c;解决长空间和时间数据依赖问题 提出背景长距离技术对比Non-local Block是怎么设计Non-local 神经网络效果 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 提出背景 论文&#xff1a;https://arxiv.org/pdf/1711.07971.pdf …

用 tensor-parallel 多卡并发推理大模型

利用 tensor-parallel 把模型训练与推理的 workload 平均分布到多块 GPU&#xff0c;一方面可以提高推理速度&#xff0c;另一方面 vram 的负载平衡也让复杂的 prompt 能被轻松处理。 import 相关的 libs&#xff1a; # torch version 2.0.0 import torch # tensor-parallel …

抽象类与抽象方法

文章目录 抽象类抽象类的特点 抽象方法抽象方法的特点 模板设计模式模板设计模式能解决的问题示例 #抽象类与抽象方法 抽象类 用abstract关键字来修饰一个类时&#xff0c;这个类就叫抽象类。 public abstract 类名{... }抽象类的特点 1&#xff09;抽象类不能被实例化。 2&…