摘要:多進(jìn)程消費(fèi)模型父進(jìn)程等待并控制子進(jìn)程的退出思路整理父進(jìn)程開啟后,直接獲取到子進(jìn)程的,然后存入數(shù)組,子進(jìn)程出來后直接開啟業(yè)務(wù)消費(fèi)代碼,然后退出,然后父進(jìn)程等待子進(jìn)程退出,全部退出后父進(jìn)程結(jié)束代碼請?jiān)谀J较逻\(yùn)行子進(jìn)程的數(shù)量如果是資源類型的變量,
多進(jìn)程消費(fèi)模型
父進(jìn)程等待并控制子進(jìn)程的退出思路整理
父進(jìn)程開啟后,直接獲取到子進(jìn)程的pid,然后存入child數(shù)組,子進(jìn)程fork出來后直接開啟業(yè)務(wù)消費(fèi)代碼,然后exit(0)退出,然后父進(jìn)程pcntl_wait等待子進(jìn)程退出,全部退出后父進(jìn)程結(jié)束代碼
const NEWLINE = " "; if (strtolower(php_sapi_name()) != "cli") { die("請?jiān)赾li模式下運(yùn)行"); } $bizPath = "./childBiz/"; if (!is_dir($bizPath)) { @mkdir($bizPath, 0755, true); } $child = []; $index = 0; $loop = 10; //子進(jìn)程的數(shù)量 //如果是資源類型的變量,父子進(jìn)程會共享 //$f = fopen("./pcntl_fork_2.php", "r"); while ($index < $loop) { echo "當(dāng)前進(jìn)程:" . getmypid() . NEWLINE; $pid = pcntl_fork(); //fork出子進(jìn)程 //fork后父進(jìn)程會走自己的邏輯,子進(jìn)程從處開始走自己的邏輯,堆棧信息會完全復(fù)制給子進(jìn)程內(nèi)存空間,父子進(jìn)程相互獨(dú)立 if ($pid == -1) { // 創(chuàng)建錯誤,返回-1 die("進(jìn)程fork失敗"); } else if ($pid) { // $pid > 0, 如果fork成功,返回子進(jìn)程id //獲取創(chuàng)建的子進(jìn)程 $child[$pid] = $pid; echo "{$pid} child create!" . microtime(true) . NEWLINE; } else { // $pid = 0 // 子進(jìn)程邏輯 $sleepTime = rand(5, 18); sleep($sleepTime); $time = microtime(true); file_put_contents($bizPath.getmypid().".log", $time . ":" . $index . PHP_EOL, FILE_APPEND); exit(0); } $index++; } while (count($child)) { //阻塞等待 $pid = pcntl_wait($status); $time = microtime(true); file_put_contents("./father.log", $time . ":" . $pid . ":" . $status . PHP_EOL, FILE_APPEND); if ($pid > 0) { unset($child[$pid]); } if ($pid == -1) { unset($child); } // foreach ($child as $k => $pid) { // //不阻塞循環(huán)判斷 WNOHANG表示如果沒有子進(jìn)程退出立刻返回 // $res = pcntl_waitpid($pid, $status, WNOHANG); // $time = microtime(true); // file_put_contents("./father.log", $time . ":" . $pid . ":" . $res . ":" . $status . PHP_EOL, FILE_APPEND); // if (-1 == $res || $res > 0) { // unset($child[$k]); // } // } } //fclose($f); //主進(jìn)程退出 exit(0);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/28820.html
摘要:說明函數(shù)創(chuàng)建一個(gè)子進(jìn)程,這個(gè)子進(jìn)程僅進(jìn)程號和父進(jìn)程號與其父進(jìn)程不同。返回值成功時(shí),在父進(jìn)程執(zhí)行線程內(nèi)返回產(chǎn)生的子進(jìn)程的,在子進(jìn)程執(zhí)行線程內(nèi)返回。失敗時(shí),在父進(jìn)程上下文返回,不會創(chuàng)建子進(jìn)程,并且會引發(fā)一個(gè)錯誤。 pcntl 簡介 PHP的進(jìn)程控制支持實(shí)現(xiàn)了Unix方式的進(jìn)程創(chuàng)建, 程序執(zhí)行, 信號處理以及進(jìn)程的中斷。 進(jìn)程控制不能被應(yīng)用在Web服務(wù)器環(huán)境,當(dāng)其被用于Web服務(wù)環(huán)境時(shí)可能會...
摘要:簡介來源官方等待或返回的子進(jìn)程狀態(tài)函數(shù)刮起當(dāng)前進(jìn)程的執(zhí)行直到一個(gè)子進(jìn)程退出或接收到一個(gè)信號要求中斷當(dāng)前進(jìn)程或調(diào)用一個(gè)信號處理函數(shù)。子進(jìn)程使用的所有系統(tǒng)資源將被釋放。子進(jìn)程已經(jīng)退出并且其狀態(tài)未報(bào)告時(shí)返回。 pcntl_wait 簡介 # 來源官方 pcntl_wait — 等待或返回fork的子進(jìn)程狀態(tài) int pcntl_wait ( int &$status [, int $op...
摘要:大家知道,一個(gè)消息隊(duì)列處理系統(tǒng)主要分為兩大部分消費(fèi)者和生產(chǎn)者。任務(wù)系統(tǒng)實(shí)時(shí)的對任務(wù)隊(duì)列進(jìn)行,出來一個(gè)任務(wù)就一個(gè)子進(jìn)程,由子進(jìn)程完成具體的任務(wù)邏輯。新的設(shè)計(jì)為了解決并發(fā)的問題,我們計(jì)劃做一個(gè)更加高效強(qiáng)壯的隊(duì)里處理系統(tǒng)。 背景 由于PHP不支持多線程,但是作為一個(gè)完善的系統(tǒng),有很多操作都是需要異步完成的。為了完成這些異步操作,我們做了一個(gè)基于Redis隊(duì)列任務(wù)系統(tǒng)。 大家知道,一個(gè)消息隊(duì)列...
摘要:代碼實(shí)現(xiàn)啟動啟動流程見流程,主要包括守護(hù)進(jìn)程保存注冊信號處理器創(chuàng)建多進(jìn)程這部分。模擬調(diào)度實(shí)際用實(shí)現(xiàn)捕獲信號其中,會在每次調(diào)度過程中,捕獲信號并執(zhí)行注冊的信號處理器。 首發(fā)于 樊浩柏科學(xué)院 經(jīng)過 用 PHP 玩轉(zhuǎn)進(jìn)程之一 — 基礎(chǔ) 的回顧復(fù)習(xí),我們已經(jīng)掌握了進(jìn)程的基礎(chǔ)知識,現(xiàn)在可以嘗試用 PHP 做一些簡單的進(jìn)程控制和管理,來加深我們對進(jìn)程的理解。接下來,我將用多進(jìn)程模型實(shí)現(xiàn)一個(gè)簡單的...
摘要:在版本中我們將的進(jìn)程管理模塊封裝成了類,現(xiàn)在可以在代碼中使用的進(jìn)程管理器了。提供的進(jìn)程管理器來自于,經(jīng)過大量生產(chǎn)項(xiàng)目驗(yàn)證,穩(wěn)定性和健壯性都非常高。三任務(wù)投遞進(jìn)程管理器自帶了消息隊(duì)列和消息投遞的支持。 在Swoole-2.1.2版本中我們將Server的進(jìn)程管理模塊封裝成了PHP類,現(xiàn)在可以在PHP代碼中使用Swoole的進(jìn)程管理器了。 在實(shí)際項(xiàng)目中經(jīng)常需要寫一些長期運(yùn)行的腳本,如基于r...
閱讀 3364·2021-10-21 17:50
閱讀 3326·2021-10-08 10:05
閱讀 3477·2021-09-22 15:04
閱讀 640·2019-08-30 14:00
閱讀 2033·2019-08-29 17:01
閱讀 1564·2019-08-29 15:16
閱讀 3275·2019-08-26 13:25
閱讀 910·2019-08-26 11:44