成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php:多進(jìn)程執(zhí)行任務(wù)

starsfun / 1574人閱讀

摘要:此時(shí)可能有子進(jìn)程繼續(xù)執(zhí)行。成功時(shí),在父進(jìn)程執(zhí)行線程內(nèi)返回產(chǎn)生的子進(jìn)程的,在子進(jìn)程執(zhí)行線程內(nèi)返回。函數(shù)刮起當(dāng)前進(jìn)程的執(zhí)行直到一個(gè)子進(jìn)程退出或接收到一個(gè)信號(hào)要求中斷當(dāng)前進(jìn)程或調(diào)用一個(gè)信號(hào)處理函數(shù)。

需求

對(duì)指定數(shù)量的多個(gè)任務(wù)并發(fā)執(zhí)行,并控制進(jìn)程數(shù)

進(jìn)程&線程:

進(jìn)程間相互獨(dú)立,不影響。

代碼示例:

= $processNumLimit) {
           echo "wait chl start!
";
           $exitid = pcntl_wait($status); //等待退出
           echo "wait chl end!extid:",$exitid,"	status:",$status,"
";
       }
       
       //任務(wù)總量控制
       if($task >= $taskNum) {
           echo "taskNum enough!
";
           break;
       }
   }
   //processid=0為新創(chuàng)建的進(jìn)程
   else{
       //模擬不同任務(wù)的不同執(zhí)行時(shí)長
       $sleep = rand(1, 5);

       $currentProcessid = posix_getpid(); //當(dāng)前進(jìn)程的Id
       $parentProcessid = posix_getppid(); // 父級(jí)進(jìn)程的ID
       $phpProcessid = getmypid(); //當(dāng)前php進(jìn)程的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); //子進(jìn)程執(zhí)行完后退出,防止進(jìn)入循環(huán)創(chuàng)建子進(jìn)程
   }
}

執(zhí)行的結(jié)果:

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
執(zhí)行分析:

在pcntl_fork出創(chuàng)建子進(jìn)程后,子進(jìn)程執(zhí)行功能代碼,父進(jìn)程繼續(xù)遞增任務(wù)id,創(chuàng)建下一個(gè)任務(wù)進(jìn)程;

通過pcntl_wait等待有子進(jìn)程執(zhí)行完畢退出后,再新創(chuàng)建進(jìn)程,實(shí)現(xiàn)進(jìn)程總數(shù)的控制;

在主進(jìn)程完成創(chuàng)建后,通過break退出循環(huán)。此時(shí)可能有子進(jìn)程繼續(xù)執(zhí)行。

相關(guān)函數(shù): pcntl_fork
在當(dāng)前進(jìn)程當(dāng)前位置產(chǎn)生分支(子進(jìn)程)。成功時(shí),在父進(jìn)程執(zhí)行線程內(nèi)返回產(chǎn)生的子進(jìn)程的PID,在子進(jìn)程執(zhí)行線程內(nèi)返回0。失敗時(shí),在 父進(jìn)程上下文返回-1,不會(huì)創(chuàng)建子進(jìn)程,并且會(huì)引發(fā)一個(gè)PHP錯(cuò)誤。
pcntl_wait
等待或返回fork的子進(jìn)程狀態(tài)。wait函數(shù)刮起當(dāng)前進(jìn)程的執(zhí)行直到一個(gè)子進(jìn)程退出或接收到一個(gè)信號(hào)要求中斷當(dāng)前進(jìn)程或調(diào)用一個(gè)信號(hào)處理函數(shù)。 如果一個(gè)子進(jìn)程在調(diào)用此函數(shù)時(shí)已經(jīng)退出(俗稱僵尸進(jìn)程),此函數(shù)立刻返回。子進(jìn)程使用的所有系統(tǒng)資源將 被釋放。
其他:

1.僵尸進(jìn)程及孤兒進(jìn)程的問題

部分僵尸進(jìn)程被pcntl_wait獲取狀態(tài)并釋放資源,未接管的進(jìn)程在主進(jìn)程退出后成為孤兒進(jìn)程。孤兒進(jìn)程被init進(jìn)程收養(yǎng),完成wait的狀態(tài)獲取和資源釋放。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28981.html

相關(guān)文章

  • PHP 命令行方式實(shí)現(xiàn)異步進(jìn)程模式的任務(wù)處理

    摘要:定義任務(wù)處理方法。讀取來自命令行的參數(shù),開始執(zhí)行任務(wù)。該函數(shù)有兩個(gè)參數(shù)和,是引用類型,用來存儲(chǔ)子進(jìn)程的狀態(tài),有兩個(gè)可選常量,分別表示不等待子進(jìn)程結(jié)束立即返回和等待子進(jìn)程結(jié)束。 用PHP來實(shí)現(xiàn)異步任務(wù)一直是個(gè)難題,現(xiàn)有的解決方案中:PHP知名的異步框架有 swoole 和 Workerman,但都是無法在 web 環(huán)境中直接使用的,即便強(qiáng)行搭建 web 環(huán)境,異步調(diào)用也是使用多進(jìn)程模式實(shí)...

    Invoker 評(píng)論0 收藏0
  • PHP下的異步嘗試二:初識(shí)協(xié)程

    摘要:如果僅依靠程序自動(dòng)交出控制的話,那么一些惡意程序?qū)?huì)很容易占用全部時(shí)間而不與其他任務(wù)共享。多個(gè)操作可以在重疊的時(shí)間段內(nèi)進(jìn)行。 PHP下的異步嘗試系列 如果你還不太了解PHP下的生成器,你可以根據(jù)下面目錄翻閱 PHP下的異步嘗試一:初識(shí)生成器 PHP下的異步嘗試二:初識(shí)協(xié)程 PHP下的異步嘗試三:協(xié)程的PHP版thunkify自動(dòng)執(zhí)行器 PHP下的異步嘗試四:PHP版的Promise ...

    MudOnTire 評(píng)論0 收藏0
  • PHP 進(jìn)程的實(shí)現(xiàn)與管理

    摘要:運(yùn)行模式實(shí)現(xiàn)進(jìn)程前,需了解常見的的運(yùn)行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進(jìn)程則是使用命令行模式運(yùn)行的基本實(shí)現(xiàn)中提供了一個(gè)擴(kuò)展,可以利用操作系統(tǒng)的調(diào)用來實(shí)現(xiàn)多進(jìn)程。 應(yīng)用場(chǎng)景 一些耗時(shí)任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計(jì)信息功能 分批發(fā)送短信或郵件功能 其他可分目標(biāo)的任務(wù)功能(很多種) 所以我們就需要一個(gè)常駐內(nèi)存的任務(wù)管理工具,為了保證實(shí)時(shí)性,一方面我們讓它一直執(zhí)行任...

    MockingBird 評(píng)論0 收藏0
  • PHP 進(jìn)程的實(shí)現(xiàn)與管理

    摘要:運(yùn)行模式實(shí)現(xiàn)進(jìn)程前,需了解常見的的運(yùn)行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進(jìn)程則是使用命令行模式運(yùn)行的基本實(shí)現(xiàn)中提供了一個(gè)擴(kuò)展,可以利用操作系統(tǒng)的調(diào)用來實(shí)現(xiàn)多進(jìn)程。 應(yīng)用場(chǎng)景 一些耗時(shí)任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計(jì)信息功能 分批發(fā)送短信或郵件功能 其他可分目標(biāo)的任務(wù)功能(很多種) 所以我們就需要一個(gè)常駐內(nèi)存的任務(wù)管理工具,為了保證實(shí)時(shí)性,一方面我們讓它一直執(zhí)行任...

    testbird 評(píng)論0 收藏0
  • PHP進(jìn)程初探 --- 利用進(jìn)程開發(fā)點(diǎn)兒東西吧

    摘要:主進(jìn)程退出子進(jìn)程繼續(xù)執(zhí)行給進(jìn)程重新起個(gè)名字加入我們出個(gè)子進(jìn)程就可以搞定這些任務(wù),那么出個(gè)子進(jìn)程,同時(shí)父進(jìn)程要負(fù)責(zé)這個(gè)子進(jìn)程的狀態(tài)等。 [原文地址:https://blog.ti-node.com/blog...] 干巴巴地叨逼叨了這么久,時(shí)候表演真正的技術(shù)了! 做個(gè)高端點(diǎn)兒的玩意吧,加入我們要做一個(gè)任務(wù)系統(tǒng),這個(gè)系統(tǒng)可以在后臺(tái)幫我們完成一大波(注意是一大波)數(shù)據(jù)的處理,那么我們自然想到...

    huaixiaoz 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<