摘要:對編程的理解,應(yīng)該到深入到操作系統(tǒng)級別。進程控制,我一直都沒有接觸,感覺好高端,今天啃了一下擴展的最簡單的兩個函數(shù),有點心得,記錄一下吧,歡迎拋磚。
對編程的理解,應(yīng)該到深入到操作系統(tǒng)級別。進程控制,我一直都沒有接觸,感覺好高端,今天啃了一下pcntl擴展的最簡單的兩個函數(shù),有點心得,記錄一下吧,歡迎拋磚。
新建代碼文件 pcntl_wait.php,如下:
$i = 0; while($i < 2) { $pid = pcntl_fork(); // 父進程和子進程都會執(zhí)行以下代碼 if ($pid == -1) { // 創(chuàng)建子進程錯誤,返回-1 die("could not fork"); } else if ($pid) { // 父進程會得到子進程號,所以這里是父進程執(zhí)行的邏輯 pcntl_wait($status); // 父進程必須等待一個子進程退出后,再創(chuàng)建下一個子進程。 $cid = $pid; // 子進程的ID $pid = posix_getpid(); // pid 與mypid一樣,是當(dāng)前進程Id $myid = getmypid(); $ppid = posix_getppid(); // 進程的父級ID $time = microtime(true); echo "I am parent cid:$cid myid:$myid pid:$pid ppid:$ppid i:$i $time "; } else { // 子進程得到的$pid 為0,所以這里是子進程的邏輯 $cid = $pid; $pid = posix_getpid(); $ppid = posix_getppid(); $myid = getmypid(); $time = microtime(true); echo "I am child cid:$cid myid:$myid pid:$pid ppid:$ppid i:$i $time "; //exit; //sleep(2); } $i++; }
php -f pcntl_wait.php 運行結(jié)果如下:
I am child cid:0 myid:6499 pid:6499 ppid:6498 i:0 1491394182.2065 I am child cid:0 myid:6500 pid:6500 ppid:6499 i:1 1491394182.2077 I am parent cid:6500 myid:6499 pid:6499 ppid:6498 i:1 1491394182.2143 I am parent cid:6499 myid:6498 pid:6498 ppid:3471 i:0 1491394182.2211 I am child cid:0 myid:6501 pid:6501 ppid:6498 i:1 1491394182.222 I am parent cid:6501 myid:6498 pid:6498 ppid:3471 i:1 1491394182.2302
為何是如上運行過程?
參考了PHP手冊和網(wǎng)友blog以上代碼能夠循環(huán)產(chǎn)生子進程,并且父進程會阻塞等待子進程退出,這樣就產(chǎn)生了一個問題,父進程必須等待一個子進程退出后,再創(chuàng)建另外一個
個人分析如下:
1.運行shell命令(該進程ID是3471),生成主進程PID為6498
開始循環(huán)i=0
6498 此時的父進程 |fork 6499 父進程(6498阻塞),該子進程(6499)執(zhí)行 ,輸出:child cid:0 myid:6499 pid:6499 ppid:6498 i:0 1491394182.2065 然后i++ i=1,再次循環(huán)
繼續(xù)循環(huán)i=1
6499 此時的父進程 |fork 6500 父進程(6499阻塞),該子進程(6500)執(zhí)行,輸出:child cid:0 myid:6500 pid:6500 ppid:6499 i:1 1491394182.2077 然后i++ i=2,本次循環(huán)終止,回到其主進程6499 6499 解除阻塞, 此時i=1(因為阻塞時i=1),繼續(xù)執(zhí)行 輸出:parent cid:6500 myid:6499 pid:6499 ppid:6498 i:1 1491394182.2143 然后i++ i=2,本次循環(huán)終止,回到其主進程6498 6498 解除阻塞, 此時i=0(因為阻塞時i=0),繼續(xù)執(zhí)行,輸出:parent cid:6499 myid:6498 pid:6498 ppid:3471 i:0 1491394182.2211 然后i++ i=1,再次循環(huán)
繼續(xù)循環(huán)i=1
6498 此時的父進程 |fork 6501 父進程(6498阻塞),該子進程(6501)執(zhí)行,輸出:child cid:0 myid:6501 pid:6501 ppid:6498 i:1 1491394182.222 然后i++ i=2,本次循環(huán)終止,回到其主進程6498 6498 解除阻塞 此時i=1(因為阻塞時為i=1),繼續(xù)執(zhí)行,輸出:parent cid:6501 myid:6498 pid:6498 ppid:3471 i:1 1491394182.2302 然后i++ i=2,本次循環(huán)終止,回到其主進程3471,最后命令結(jié)束。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/22661.html
摘要:后面每開啟一個子進程,會將子進程的存儲到中,用來后面主進程監(jiān)控子進程,如果子進程意外終止,主進程可以重新佛。將當(dāng)前子進程設(shè)置為會話組再次創(chuàng)建子進程,為了防止在的系統(tǒng)下重新打開控制終端。 wokerman 啟動分析 @(學(xué)習(xí))[workerman, php] 前期想說的 也是最近才看的代碼,遇到不懂得地方就去google,所以這篇文章里面穿插了很多參考資料,可以直接點擊閱覽。 需要了解一...
摘要:目的綜上所述,我的目標(biāo)就是實現(xiàn)基于模式實現(xiàn)的多進程管理工具。備注下文中,父進程統(tǒng)稱為子進程統(tǒng)稱為。最后我們通過下圖來簡單的總結(jié)和描述這個多進程實現(xiàn)的過程控制上面實現(xiàn)了多進程和多進程的常駐內(nèi)存,那如何去管理呢答案多進程通信。 _ | | _ __ __ _ _ __...
摘要:多進程中與多進程相關(guān)的兩個重要拓展是和。函數(shù)執(zhí)行期間,主進程除了等待無法處理其他任務(wù),所以一般不認(rèn)為這是多進程編程?;厥兆舆M程有兩種方式,一種是主進程調(diào)用函數(shù)等待子進程結(jié)束另外一種是處理信號。 轉(zhuǎn)載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie web響應(yīng) session 數(shù)據(jù)庫操作 加解...
摘要:運行模式實現(xiàn)進程前,需了解常見的的運行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進程則是使用命令行模式運行的基本實現(xiàn)中提供了一個擴展,可以利用操作系統(tǒng)的調(diào)用來實現(xiàn)多進程。 應(yīng)用場景 一些耗時任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計信息功能 分批發(fā)送短信或郵件功能 其他可分目標(biāo)的任務(wù)功能(很多種) 所以我們就需要一個常駐內(nèi)存的任務(wù)管理工具,為了保證實時性,一方面我們讓它一直執(zhí)行任...
摘要:運行模式實現(xiàn)進程前,需了解常見的的運行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進程則是使用命令行模式運行的基本實現(xiàn)中提供了一個擴展,可以利用操作系統(tǒng)的調(diào)用來實現(xiàn)多進程。 應(yīng)用場景 一些耗時任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計信息功能 分批發(fā)送短信或郵件功能 其他可分目標(biāo)的任務(wù)功能(很多種) 所以我們就需要一個常駐內(nèi)存的任務(wù)管理工具,為了保證實時性,一方面我們讓它一直執(zhí)行任...
閱讀 2090·2023-04-25 22:50
閱讀 2885·2021-09-29 09:35
閱讀 3465·2021-07-29 10:20
閱讀 3244·2019-08-29 13:57
閱讀 3416·2019-08-29 13:50
閱讀 3098·2019-08-26 12:10
閱讀 3626·2019-08-23 18:41
閱讀 2694·2019-08-23 18:01