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.pswp.cn/news/713176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713176.shtml
英文地址,請注明出處:http://en.pswp.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&…