国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python清理子進程機制剖析

2020-01-04 16:16:09
字體:
來源:轉載
供稿:網友

起步

在我的印象中,python/285706.html">python的機制會自動清理已經完成任務的子進程的。通過網友的提問,還真看到了僵尸進程。

import multiprocessing as mpimport osimport timedef pro(): print ("os.pid is ", os.getpid())if __name__ == '__main__': print ("parent ", os.getpid()) while True:  p = mp.Process(target = pro)  p.start()  time.sleep(1)

python,子進程,進程

于是我覺得我要重新了解一下這個過程。

銷毀僵尸進程的時機

mutilprossing.Process 繼承自 BaseProcess 文件在 Lib/mutilprossing/process.py 中,我們看看它的start方法:

_children = set()class BaseProcess(object): def start(self):  self._check_closed()  _cleanup()  self._popen = self._Popen(self)  self._sentinel = self._popen.sentinel  # Avoid a refcycle if the target function holds an indirect  # reference to the process object (see bpo-30775)  del self._target, self._args, self._kwargs  _children.add(self)

_children 是一個全局的集合變量,保存著所有 BaseProcess 實例, start 函數末尾處 _children.add(self) 將進程對象放入。又注意到 _cleanup() 函數:

def _cleanup(): # check for processes which have finished for p in list(_children):  if p._popen.poll() is not None:   _children.discard(p)

_popen 是一個 Popen 對象,代碼在 multiprossing/popen_fork.py 中,其 poll 函數有個 id, sts = os.waitpid(self.pid, flag) 一個回收子進程的函數。回收后再將 BaseProcess 子類實例從_children中移除。

這下就清楚了,python在子進程start中將進程放入集合,子進程可能長時間運行,因此這個集合上的進程會有很多狀態,而為了防止過多僵尸進程導致資源占用,python會在下一個子進程 start 時清理僵尸進程。所以,最后一個子進程在自身程序運行完畢后就變成僵尸進程,它在等待下一個子進程start時被清理。所以 ps 上總有一個僵尸進程,但這個僵尸進程的 進程id 一直在變化。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉中市| 荥阳市| 临西县| 老河口市| 舟曲县| 金乡县| 长武县| 咸丰县| 嘉禾县| 抚松县| 沁阳市| 苏尼特右旗| 洛宁县| 武隆县| 吴川市| 河西区| 广元市| 右玉县| 天津市| 逊克县| 罗城| 开封县| 西充县| 吴旗县| 施甸县| 锡林郭勒盟| 大冶市| 永兴县| 卢湾区| 从江县| 道真| 巴南区| 蛟河市| 唐山市| 綦江县| 八宿县| 洛阳市| 揭阳市| 嵊泗县| 平南县| 伊春市|