生活随笔
收集整理的這篇文章主要介紹了
简单多进程任务处理程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單多進程任務處理程序
<?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
總結
以上是生活随笔為你收集整理的简单多进程任务处理程序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。