django为什么需要子进程,如何关闭子进程,linux状态
django為什么需要子進(jìn)程
一旦用戶用manage.py runserver啟動(dòng)開(kāi)發(fā)服務(wù)器,就啟動(dòng)了一個(gè)django的進(jìn)程,當(dāng)然如果我們用ps aux,這其實(shí)是一個(gè)Python進(jìn)程,不過(guò)他運(yùn)行了manage.py而已。這個(gè)啟動(dòng)的django進(jìn)程并沒(méi)有直接就開(kāi)始作為Http Server來(lái)Listen 8000端口,而是創(chuàng)建了一個(gè)和自己一模一樣的子進(jìn)程。是子進(jìn)程真正監(jiān)聽(tīng)了端口號(hào)
為什么呢?因?yàn)閐jango要方便,當(dāng)開(kāi)發(fā)人員每次修改Python源文件的時(shí)候,在網(wǎng)頁(yè)上能夠立刻看到效果。
這個(gè)子進(jìn)程已啟動(dòng)會(huì)檢查自己是否一個(gè)子進(jìn)程,如果是的話開(kāi)始調(diào)用一個(gè)inner_run的函數(shù),這個(gè)函數(shù)開(kāi)始Listen 8000端口,作為Http Server開(kāi)始服務(wù)。如果開(kāi)發(fā)人員沒(méi)有Python代碼,一切都OK,如果django父進(jìn)程發(fā)現(xiàn)Python代碼被修改,他會(huì)重啟這個(gè)子進(jìn)程,重裝如Python代碼,這樣修改后的Python代碼就會(huì)在網(wǎng)頁(yè)上體現(xiàn)出來(lái)了。
注:
同時(shí)用kill殺死子進(jìn)程的時(shí)候,父進(jìn)程也會(huì)消失,
而殺死父進(jìn)程的時(shí)候,子進(jìn)程還在,說(shuō)明django中是父進(jìn)程一直在監(jiān)控子進(jìn)程的修改。
以下是證明例子:
/usr/bin/python3.8 /home/szr/lzztes/manage.py runserver 0.0.0.0:8000 命定啟動(dòng)django后,ps aux可以發(fā)現(xiàn)有創(chuàng)建了兩個(gè)進(jìn)程號(hào)為13866和13868的進(jìn)程,且13868的狀態(tài)為sl+,說(shuō)明是休眠狀態(tài),多線程(克隆線程),且是后臺(tái)進(jìn)程。
使用sudo lsof -i:8000監(jiān)聽(tīng)8000端口,發(fā)現(xiàn)是子進(jìn)程13868監(jiān)聽(tīng)的
通常調(diào)試的django進(jìn)程是django的父進(jìn)程,而這個(gè)父進(jìn)程并不是真正的Http Server,真正的Http Server是子進(jìn)程。所以我們?cè)诖a中下的斷點(diǎn)是永遠(yuǎn)不會(huì)被運(yùn)行的,因?yàn)榇a是那個(gè)子進(jìn)程中運(yùn)行的。 所以讓django不產(chǎn)生子進(jìn)程,讓父進(jìn)程直接作為Http Server來(lái)運(yùn)行,通過(guò)python manage.py runserver --noreload 來(lái)執(zhí)行
執(zhí)行結(jié)果如下,/usr/bin/python3.8 /home/szr/lzztes/manage.py runserver 0.0.0.0:8000 --noreload 命定啟動(dòng)django后,發(fā)現(xiàn)只啟動(dòng)了父進(jìn)程14271,狀態(tài)是S+,并且該父進(jìn)程作為真正的Http Server來(lái)監(jiān)聽(tīng)8000端口。
如何關(guān)閉子進(jìn)程
此方法啟動(dòng)開(kāi)發(fā)服務(wù)器時(shí),如果對(duì)python代碼進(jìn)行修改,則服務(wù)器會(huì)自動(dòng)重啟。
python manage.py runserverDjango的內(nèi)置開(kāi)發(fā)服務(wù)器默認(rèn)啟用了自動(dòng)重載功能,它生成一個(gè)新線程作為重新加載代碼的方法。不想開(kāi)啟子進(jìn)程可以執(zhí)行以下操作,此方法啟動(dòng)開(kāi)發(fā)服務(wù)器時(shí),對(duì)django項(xiàng)目python代碼修改,服務(wù)器不會(huì)自動(dòng)重啟:
python manage.py runserver --noreload附: 在Linux中的狀態(tài):
D 不可中斷 Uninterruptible sleep (usually IO)
R 正在運(yùn)行,或在隊(duì)列中的進(jìn)程
S 處于休眠狀態(tài)
T 停止或被追蹤
Z 僵尸進(jìn)程
W 進(jìn)入內(nèi)存交換(從內(nèi)核2.6開(kāi)始無(wú)效)
X 死掉的進(jìn)程
< 高優(yōu)先級(jí)
N 低優(yōu)先級(jí)
L 有些頁(yè)被鎖進(jìn)內(nèi)存
s 包含子進(jìn)程
+ 位于后臺(tái)的進(jìn)程組
l 多線程,克隆線程
根據(jù)以上信息,得知sl+處于休眠狀態(tài),多線程(克隆線程),且是后臺(tái)進(jìn)程。
總結(jié)
以上是生活随笔為你收集整理的django为什么需要子进程,如何关闭子进程,linux状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: supervisor配置文件中如何添加多
- 下一篇: zsh配置其显示当前文件路径