【一】僵尸進程
1.僵尸進程是指完成自己的任務之后,沒有被父進程回收資源,占用系統資源,對計算機有害,應該避免
""" 所有的子進程在運行結束之后都會變成僵尸進程(死了沒死透)還保留著pid和一些運行過程的中的記錄便于主進程查看(短時間保存)這些信息會被主進程回收(僵尸徹底死了)"""
2.例子:當你關閉pycharm時,關于pycharm的進程都應該被關閉,有時候你會發現,有某幾個 pycharm 進程任然在后臺運行 --> 本來這部分資源應該被回收,結果因為還在運行,占用系統資源,這些沒被回收的就是僵尸進程
3.解決辦法:(1)UNIX提供了一種機制可以保證父進程可以在任意時刻獲取子進程結束時的狀態信息
【二】孤兒進程
1.孤兒進程是指父進程在子進程終止之前就結束了
2.例子: 在沒有關閉共享屏幕的前提下直接退出騰訊會議,你的共享屏幕也會退出而不是一直掛在后臺
3.解決辦法:init進程 ,會接管這些沒有父親的孤兒,就把所有子線程殺死
【三】僵尸進程和孤兒進程誰的危害性更大?
僵尸進程的危害性更大
因為僵尸進程一直會持續存在在后臺占用資源
孤兒進程因為主進程死亡后讓然有init進程接管并銷毀
【四】守護進程
1.守護即死活全部參與守護的對象對象死立刻死
2.例子:將子進程設置為守護進程:主進程結束 子進程立刻結束關機,各個進程服務都會關閉
子進程.daemon = True
代碼例子
#主進程死,子進程必死,就像是給子進程加一個模式
# 要在進程開始start前加
from multiprocessing import Process
# 用加了守護和不加守護進行對比
def task1():print("我是進程1")
def task2():print("我是進程2")
if __name__ == '__main__':p1=Process(target=task1,)p2=Process(target=task2,)p1.daemon=Truep1.start()p2.start()p1.join()#加了join會讓主進程阻塞住,讓該子進程先執行print("我是主進程")"""結果:我是進程1我是主進程我是進程2
?"""
小練習
# 主進程代碼運行完畢,守護進程就會結束
from multiprocessing import Process
from threading import Thread
import time
?
?
def foo():print(123)time.sleep(1)print("end123")
?
?
def bar():print(456)time.sleep(3)print("end456")
?
?
if __name__ == '__main__':p1 = Process(target=foo)p2 = Process(target=bar)
?p1.daemon = Truep1.start()p2.start()
?# 打印該行則主進程代碼結束,則守護進程p1應該被終止,可能會有p1任務執行的打印信息123# 因為主進程打印main----時,p1也執行了,但是隨即被終止print("main-------")# main-------# 456# end456