简单多进程任务处理程序


<?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

简单多进程任务处理程序相关推荐

  1. Spring MVC-处理程序映射(Handler Mapping)-简单的Url处理程序映射(Simple Url Handler Mapping)示例(转载实践)...

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_simpleurlhandlermapping.htm 说明:示例基于Spring ...

  2. 基于qml创建最简单的图像处理程序(1)-基于qml创建界面

    <基于qml创建最简单的图像处理程序>系列课程及配套代码 基于qml创建最简单的图像处理程序(1)-基于qml创建界面 http://www.cnblogs.com/jsxyhelu/p/ ...

  3. linux多进程能同时执行吗,Linux开发简单多进程应用

    一个进程中的多个线程共享一个进程的堆等内存空间,所以实现数据交互是很方便的:但多进程架构中,要想实现多进程间的数据交互相对就困难很多! 进程间通信(IPC,InterProcess Communica ...

  4. 自己动手写一个简单的MVC框架(第一版)

    一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...

  5. 多进程和多线程的区别

    多线程和多进程的区别(重点 必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催) ...

  6. 一个简单的静态web服务器

    用python的socket写的一个简单多进程服务器 #-*-coding:utf-8-*- import re from socket import * from multiprocessing i ...

  7. python使用spark_如何在Python中编写简单代码,并且速度超越Spark?

    全文共3482字,预计学习时长7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选择. ...

  8. python 字节流分段_如何在Python中编写简单代码,并且速度超越Spark?

    全文共 3482字,预计学习时长 7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选 ...

  9. 简单说明JSP和Java的关系_JSP 总结

    JSP(Java Server Page) JSP是服务器端运行的页面,JSP本就是一个文档,他不仅可以包含静态的HTML代码,也可以包含动态的JAVA代码,服务器容器可以将JSP转换成Servlet ...

最新文章

  1. 数据科学中必须知道的5个关于奇异值分解(SVD)的应用
  2. 【OpenCV 4开发详解】直方图应用
  3. 使用nat技术实现tcp负载均衡
  4. Java设计模式之结构型:组合模式
  5. Redis的设计与实现之对象
  6. 利用Chrome开发者工具分析C4C Opportunity搜索的前端性能
  7. SAP Kyma的environmment和SAP 云平台的Global Account
  8. python 概率分布类型检验_统计学:假设检验Python案例实现+概率论基础知识回顾...
  9. c语言二叉树_linux学习第20节,二叉树的特性和插入、查询、删除等基本操作
  10. vs新建一个excelpackage时间太长_炖牛肉vs煎牛肉,前者几小时后者几分钟,大厨告诉了我原因...
  11. apache 网页301重定向、自定义400/403/404/500错误页面
  12. python37安装失败怎么搞_Linux 安装Python37
  13. 计算机硬件系统储存包括那些,硬件系统包括什么
  14. 安卓系统网络服务器地址,安卓系统 云服务器地址
  15. nodeJS实现牛客网、赛码网在线编程输入输出
  16. 如何制作U盘启动盘来安装电脑系统
  17. 物联卡中心:物联卡实名制安不安全?
  18. VMware内CentOS-7-Minimal的安装与配置(详细图文教程)
  19. 【金融科技发展研究】国内研究:科技助力农业金融创新
  20. C++——vector容器的基本使用和模拟实现

热门文章

  1. 杭电1180java实现(bfs)
  2. 深入理解Aho-Corasick自动机算法
  3. MySQL多表查询和事务安全
  4. Oracle rollup 关键字用法简介.
  5. 给solr配置中文分词器
  6. lstm 根据前文预测词_干货 | Pytorch实现基于LSTM的单词检测器
  7. c语言二元运算符大全,C语言运算符大全
  8. java正三角形程序怎么写,java实现正三角形和到正三角形
  9. c语言指针的自我评价,个人自我评价
  10. ALB Ingress 发布,轻松应对云原生应用流量管理