摘要:輸出結(jié)果子進(jìn)程回收阻塞方式剛剛有么一般我習(xí)慣用加上命令來查找運行著的后臺進(jìn)程。還有一種方法,既可以回收已經(jīng)結(jié)束的子進(jìn)程,又可以并行。但是這個時候,子進(jìn)程會被交給號進(jìn)程,號進(jìn)程成為了這些子進(jìn)程的繼父。
使用多進(jìn)程的優(yōu)點:
1. 使用多進(jìn)程, 子進(jìn)程結(jié)束以后, 內(nèi)核會負(fù)責(zé)回收資源 2. 使用多進(jìn)程,子進(jìn)程異常退出不會導(dǎo)致整個進(jìn)程Thread退出. 父進(jìn)程還有機會重建流程. 3. 一個常駐主進(jìn)程, 只負(fù)責(zé)任務(wù)分發(fā), 邏輯更清楚.
PHP中實現(xiàn)多進(jìn)程,Let"s Go.
我們需要安裝pcnt擴展
pcntl是process control的縮寫,通常,php會默認(rèn)安裝這個擴展。使用phpinfo()函數(shù)查看擴展是否存在。
使用pcntl_fork() 函數(shù)創(chuàng)建子進(jìn)程
pcntl_fork作用就是創(chuàng)建和當(dāng)前進(jìn)程一樣的子進(jìn)程,這個子進(jìn)程代碼段和當(dāng)前進(jìn)程一模一樣,但是擁有自己的數(shù)據(jù)段。看一個最簡單的創(chuàng)建子進(jìn)程的方法:
pcntl_fork()調(diào)用成功以后,一個程序變成了兩個程序:一個程序得到的$pid變量值是0,它是子進(jìn)程;另一個程序得到的$pid的值大于0,這個值是子進(jìn)程的PID,它是父進(jìn)程。
輸出結(jié)果:
子進(jìn)程回收
① 阻塞方式
剛剛有ps么?一般我習(xí)慣用ps aux加上grep命令來查找運行著的后臺進(jìn)程。其中有一列STAT,標(biāo)識了每個進(jìn)程的運行狀態(tài)。這里,我們關(guān)注狀態(tài)Z:僵尸(Zombie)。當(dāng)子進(jìn)程比父進(jìn)程先退出,而父進(jìn)程沒對其做任何處理的時候,子進(jìn)程將會變成僵尸進(jìn)程。僵尸進(jìn)程雖然不占什么內(nèi)存,但是很礙眼。(別忘了它們還占用著PID)
一般來說,在父進(jìn)程結(jié)束之前回收掛掉的子進(jìn)程就可以了。在pcntl擴展里面有一個pcntl_wait()函數(shù),通過這個方法等待進(jìn)程結(jié)束,然后回收已經(jīng)結(jié)束的進(jìn)程。
② 非阻塞方式
阻塞方式失去了多進(jìn)程的并行性。還有一種方法,既可以回收已經(jīng)結(jié)束的子進(jìn)程,又可以并行。這就是非阻塞的方式。如果父進(jìn)程先掛了怎么辦?
會發(fā)生什么?什么也不會發(fā)生,子進(jìn)程依舊還在運行。但是這個時候,子進(jìn)程會被交給1號進(jìn)程,1號進(jìn)程成為了這些子進(jìn)程的繼父。1號進(jìn)程會很好地處理這些進(jìn)程的資源,當(dāng)它們結(jié)束時1號進(jìn)程會自動回收資源。所以,另一種處理僵尸進(jìn)程的臨時辦法是關(guān)閉它們的父進(jìn)程。
最后需要注意的:
進(jìn)程控制不能被應(yīng)用在Web服務(wù)器環(huán)境,當(dāng)其被用于Web服務(wù)環(huán)境時可能會帶來意外的結(jié)果。 -- 摘自PHP手冊
參考:
http://www.hackingwithphp.com/16/1/3/getting-into-multiprocessing http://www.jb51.net/article/71232.htm http://www.laruence.com/2009/06/11/930.html http://imhuchao.com/596.html https://www.pureweber.com/article/php-multi-process-programming-preview/關(guān)注我的公眾號,一起成長
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22643.html
摘要:多進(jìn)程中與多進(jìn)程相關(guān)的兩個重要拓展是和。函數(shù)執(zhí)行期間,主進(jìn)程除了等待無法處理其他任務(wù),所以一般不認(rèn)為這是多進(jìn)程編程。回收子進(jìn)程有兩種方式,一種是主進(jìn)程調(diào)用函數(shù)等待子進(jìn)程結(jié)束另外一種是處理信號。 轉(zhuǎn)載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie web響應(yīng) session 數(shù)據(jù)庫操作 加解...
摘要:下文如無特殊聲明將使用進(jìn)程同時表示進(jìn)程線程。收到數(shù)據(jù)后服務(wù)器程序進(jìn)行處理然后使用向客戶端發(fā)送響應(yīng)。現(xiàn)在各種高并發(fā)異步的服務(wù)器程序都是基于實現(xiàn)的,比如。 并發(fā) IO 問題一直是服務(wù)器端編程中的技術(shù)難題,從最早的同步阻塞直接 Fork 進(jìn)程,到 Worker 進(jìn)程池/線程池,到現(xiàn)在的異步IO、協(xié)程。PHP 程序員因為有強大的 LAMP 框架,對這類底層方面的知識知之甚少,本文目的就是詳細(xì)介...
摘要:本文先回顧生成器,然后過渡到協(xié)程編程。其作用主要體現(xiàn)在三個方面數(shù)據(jù)生成生產(chǎn)者,通過返回數(shù)據(jù)數(shù)據(jù)消費消費者,消費傳來的數(shù)據(jù)實現(xiàn)協(xié)程。解決回調(diào)地獄的方式主要有兩種和協(xié)程。重點應(yīng)當(dāng)關(guān)注控制權(quán)轉(zhuǎn)讓的時機,以及協(xié)程的運作方式。 轉(zhuǎn)載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie web響應(yīng) sess...
摘要:本文使用與完成一個的進(jìn)程池,并且支持動態(tài)創(chuàng)建新進(jìn)程。接著遍歷所有的進(jìn)程,并且加入中,設(shè)置可讀事件,用于接收子進(jìn)程的空閑信號。最后每隔一秒向進(jìn)程投遞任務(wù)。由于只模擬了十次任務(wù),則第十個任務(wù)完成之后在父進(jìn)程中發(fā)送使所有子進(jìn)程退出。 swoole_process 主要是用來代替 PHP 的 pcntl 擴展。我們知道 pcntl 是用來進(jìn)行多進(jìn)程編程的,而 pcntl 只提供了 fork 這...
閱讀 1085·2021-10-14 09:42
閱讀 1381·2021-09-22 15:11
閱讀 3293·2019-08-30 15:56
閱讀 1251·2019-08-30 15:55
閱讀 3620·2019-08-30 15:55
閱讀 896·2019-08-30 15:44
閱讀 2032·2019-08-29 17:17
閱讀 2079·2019-08-29 15:37