摘要:此時可能有子進程繼續執行。成功時,在父進程執行線程內返回產生的子進程的,在子進程執行線程內返回。函數刮起當前進程的執行直到一個子進程退出或接收到一個信號要求中斷當前進程或調用一個信號處理函數。
需求
對指定數量的多個任務并發執行,并控制進程數
進程&線程:進程間相互獨立,不影響。
代碼示例:
= $processNumLimit) { echo "wait chl start! "; $exitid = pcntl_wait($status); //等待退出 echo "wait chl end!extid:",$exitid," status:",$status," "; } //任務總量控制 if($task >= $taskNum) { echo "taskNum enough! "; break; } } //processid=0為新創建的進程 else{ //模擬不同任務的不同執行時長 $sleep = rand(1, 5); $currentProcessid = posix_getpid(); //當前進程的Id $parentProcessid = posix_getppid(); // 父級進程的ID $phpProcessid = getmypid(); //當前php進程的id echo "task:",$task," processid:",$processid," currentProcessid:",$currentProcessid," parentProcessid:",$parentProcessid," phpProcessid:",$phpProcessid," sleep:",$sleep," begin! "; sleep($sleep); echo "task:",$task," processid:",$processid," currentProcessid:",$currentProcessid," parentProcessid:",$parentProcessid," phpProcessid:",$phpProcessid," sleep:",$sleep," end! "; exit(0); //子進程執行完后退出,防止進入循環創建子進程 } }
執行的結果:
task:1 processid:32225 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 begin! task:2 processid:32226 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 begin! task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 end! wait chl end!extid:32226 status:0 task:3 processid:32228 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 begin! task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 end! wait chl end!extid:32228 status:0 task:4 processid:32229 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 begin! task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 end! wait chl end!extid:32225 status:0 task:5 processid:32270 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 begin! task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 end! wait chl end!extid:32229 status:0 task:6 processid:32271 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 begin! task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 end! wait chl end!extid:32270 status:0 task:7 processid:32273 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 begin! task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 end! wait chl end!extid:32273 status:0 task:8 processid:32274 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 begin! task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 end! task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 end! wait chl end!extid:32274 status:0 task:9 processid:32277 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! wait chl end!extid:32271 status:0 task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 begin! task:10 processid:32278 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 begin! task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 end! task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 end! wait chl end!extid:32277 status:0 taskNum enough執行分析:
在pcntl_fork出創建子進程后,子進程執行功能代碼,父進程繼續遞增任務id,創建下一個任務進程;
通過pcntl_wait等待有子進程執行完畢退出后,再新創建進程,實現進程總數的控制;
在主進程完成創建后,通過break退出循環。此時可能有子進程繼續執行。
相關函數: pcntl_fork在當前進程當前位置產生分支(子進程)。成功時,在父進程執行線程內返回產生的子進程的PID,在子進程執行線程內返回0。失敗時,在 父進程上下文返回-1,不會創建子進程,并且會引發一個PHP錯誤。pcntl_wait
等待或返回fork的子進程狀態。wait函數刮起當前進程的執行直到一個子進程退出或接收到一個信號要求中斷當前進程或調用一個信號處理函數。 如果一個子進程在調用此函數時已經退出(俗稱僵尸進程),此函數立刻返回。子進程使用的所有系統資源將 被釋放。其他:
1.僵尸進程及孤兒進程的問題
部分僵尸進程被pcntl_wait獲取狀態并釋放資源,未接管的進程在主進程退出后成為孤兒進程。孤兒進程被init進程收養,完成wait的狀態獲取和資源釋放。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/28981.html
摘要:定義任務處理方法。讀取來自命令行的參數,開始執行任務。該函數有兩個參數和,是引用類型,用來存儲子進程的狀態,有兩個可選常量,分別表示不等待子進程結束立即返回和等待子進程結束。 用PHP來實現異步任務一直是個難題,現有的解決方案中:PHP知名的異步框架有 swoole 和 Workerman,但都是無法在 web 環境中直接使用的,即便強行搭建 web 環境,異步調用也是使用多進程模式實...
摘要:如果僅依靠程序自動交出控制的話,那么一些惡意程序將會很容易占用全部時間而不與其他任務共享。多個操作可以在重疊的時間段內進行。 PHP下的異步嘗試系列 如果你還不太了解PHP下的生成器,你可以根據下面目錄翻閱 PHP下的異步嘗試一:初識生成器 PHP下的異步嘗試二:初識協程 PHP下的異步嘗試三:協程的PHP版thunkify自動執行器 PHP下的異步嘗試四:PHP版的Promise ...
摘要:運行模式實現進程前,需了解常見的的運行模式通用網關接口模式模式命令行模式模塊模式作為服務器模塊而進程則是使用命令行模式運行的基本實現中提供了一個擴展,可以利用操作系統的調用來實現多進程。 應用場景 一些耗時任務: 大數據表分表后的統計信息功能 分批發送短信或郵件功能 其他可分目標的任務功能(很多種) 所以我們就需要一個常駐內存的任務管理工具,為了保證實時性,一方面我們讓它一直執行任...
摘要:運行模式實現進程前,需了解常見的的運行模式通用網關接口模式模式命令行模式模塊模式作為服務器模塊而進程則是使用命令行模式運行的基本實現中提供了一個擴展,可以利用操作系統的調用來實現多進程。 應用場景 一些耗時任務: 大數據表分表后的統計信息功能 分批發送短信或郵件功能 其他可分目標的任務功能(很多種) 所以我們就需要一個常駐內存的任務管理工具,為了保證實時性,一方面我們讓它一直執行任...
摘要:主進程退出子進程繼續執行給進程重新起個名字加入我們出個子進程就可以搞定這些任務,那么出個子進程,同時父進程要負責這個子進程的狀態等。 [原文地址:https://blog.ti-node.com/blog...] 干巴巴地叨逼叨了這么久,時候表演真正的技術了! 做個高端點兒的玩意吧,加入我們要做一個任務系統,這個系統可以在后臺幫我們完成一大波(注意是一大波)數據的處理,那么我們自然想到...
閱讀 1535·2021-09-22 15:35
閱讀 2014·2021-09-14 18:04
閱讀 884·2019-08-30 15:55
閱讀 2458·2019-08-30 15:53
閱讀 2685·2019-08-30 12:45
閱讀 1209·2019-08-29 17:01
閱讀 2584·2019-08-29 15:30
閱讀 3521·2019-08-29 15:09