日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单多进程任务处理程序

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单多进程任务处理程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


簡單多進程任務處理程序

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

總結

以上是生活随笔為你收集整理的简单多进程任务处理程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。