简单多进程任务处理程序
简单多进程任务处理程序
<?php/*** 多进程任务处理辅助类*/
class TaskHelper{/*** worker进程最大数量, 至少两个*/protected $maxProcess;/*** 动态参数,设置为 0 表示不使用自适应进程方式*/protected $dynamicParam;/*** 任务的实际处理者,对象, 必须有 runWorker 方法*/protected $worker;public function __construct($worker, $maxProcess = 4, $dynamicParam = 0) {$this->worker = $worker;$this->maxProcess = max(2, (int)$maxProcess);$this->dynamicParam = max(0, (int)$dynamicParam);}/*** fork子进程处理数据* @param Array $data 需要处理的数据,必须是数组*/public function run(&$data) {$count = count($data);// 需要开启的子进程数$num = $this->dynamicParam ? min( $this->maxProcess, ceil($count / $this->dynamicParam) ) : $this->maxProcess;// 每个进程处理的数据量$n = ceil($count / $num); $childs = array();for($i = 0; $i < $count; $i += $n) {$pid = pcntl_fork();if($pid == -1) {echo "Fork worker failed!";return false;}if($pid) {echo "Fork worker success! pid:", $pid, "\n";$childs[] = $pid;} else {$sliceData = array_slice($data, $i, $n);$this->worker->runWorker($sliceData);exit();}}$this->check($childs);}/*** 检测子进程状态,监控子进程是否退出,并防止僵尸进程*/protected function check($childs) {while(true) {foreach($childs as $index => $pid) {$pid && $res = pcntl_waitpid($pid, $status, WNOHANG);if(!$pid || $res == -1) {echo "End worker: $pid \n";unset($childs[$index]);}}if(empty($childs)) break;sleep(1);}}
}/*** 使用示例*/
class Test {public function run() {$data = array_fill(0, 800, 1);// 开8个进程将 $data 分成8份,交由下面的 runWorker 方法处理$task = new TaskHelper($this, 8);$task->run($data); // 如果前面连接了数据库、redis等,最好在这之前关闭掉}/*** 这里编写代相应码来处理数据*/public function runWorker($data) {// do something...}
}$obj = new Test;
$obj->run();
转载于:https://www.cnblogs.com/qixidi/p/10199678.html
简单多进程任务处理程序相关推荐
- Spring MVC-处理程序映射(Handler Mapping)-简单的Url处理程序映射(Simple Url Handler Mapping)示例(转载实践)...
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_simpleurlhandlermapping.htm 说明:示例基于Spring ...
- 基于qml创建最简单的图像处理程序(1)-基于qml创建界面
<基于qml创建最简单的图像处理程序>系列课程及配套代码 基于qml创建最简单的图像处理程序(1)-基于qml创建界面 http://www.cnblogs.com/jsxyhelu/p/ ...
- linux多进程能同时执行吗,Linux开发简单多进程应用
一个进程中的多个线程共享一个进程的堆等内存空间,所以实现数据交互是很方便的:但多进程架构中,要想实现多进程间的数据交互相对就困难很多! 进程间通信(IPC,InterProcess Communica ...
- 自己动手写一个简单的MVC框架(第一版)
一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...
- 多进程和多线程的区别
多线程和多进程的区别(重点 必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催) ...
- 一个简单的静态web服务器
用python的socket写的一个简单多进程服务器 #-*-coding:utf-8-*- import re from socket import * from multiprocessing i ...
- python使用spark_如何在Python中编写简单代码,并且速度超越Spark?
全文共3482字,预计学习时长7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选择. ...
- python 字节流分段_如何在Python中编写简单代码,并且速度超越Spark?
全文共 3482字,预计学习时长 7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选 ...
- 简单说明JSP和Java的关系_JSP 总结
JSP(Java Server Page) JSP是服务器端运行的页面,JSP本就是一个文档,他不仅可以包含静态的HTML代码,也可以包含动态的JAVA代码,服务器容器可以将JSP转换成Servlet ...
最新文章
- 数据科学中必须知道的5个关于奇异值分解(SVD)的应用
- 【OpenCV 4开发详解】直方图应用
- 使用nat技术实现tcp负载均衡
- Java设计模式之结构型:组合模式
- Redis的设计与实现之对象
- 利用Chrome开发者工具分析C4C Opportunity搜索的前端性能
- SAP Kyma的environmment和SAP 云平台的Global Account
- python 概率分布类型检验_统计学:假设检验Python案例实现+概率论基础知识回顾...
- c语言二叉树_linux学习第20节,二叉树的特性和插入、查询、删除等基本操作
- vs新建一个excelpackage时间太长_炖牛肉vs煎牛肉,前者几小时后者几分钟,大厨告诉了我原因...
- apache 网页301重定向、自定义400/403/404/500错误页面
- python37安装失败怎么搞_Linux 安装Python37
- 计算机硬件系统储存包括那些,硬件系统包括什么
- 安卓系统网络服务器地址,安卓系统 云服务器地址
- nodeJS实现牛客网、赛码网在线编程输入输出
- 如何制作U盘启动盘来安装电脑系统
- 物联卡中心:物联卡实名制安不安全?
- VMware内CentOS-7-Minimal的安装与配置(详细图文教程)
- 【金融科技发展研究】国内研究:科技助力农业金融创新
- C++——vector容器的基本使用和模拟实现