1. 程式人生 > >5.1.6 守護進程daemon

5.1.6 守護進程daemon

無法 sta all lose opened close args st2 join

子進程設置為守護進程後,在主進程代碼執行結束(而非進程退出)後,子進程就終止。

如果子進程沒有設置為守護進程,那麽主進程會等子進行結束才結束主進程。

1. 守護進程的設置必須在start前設置。

2. 守護進程無法再開啟子進程。

from multiprocessing import Process
import time


def work(n):
    time.sleep(n)
    print(守護進程。。。。。)


if __name__ == __main__:
    p = Process(target=work, args=(3,))
    p.daemon 
= True p.start() # p.join() print(主進程內) # 輸出結果: # 主進程內 # 說明:子進程都沒有執行到,因為主進程已經結束。

驗證守護進程無法再開啟子進程:

from multiprocessing import Process
import time


def work(n):
    time.sleep(n)
    print(守護進程。。。。。)
    pp1 = Process(target=time.sleep, args=(3,))
    pp1.start()


if __name__
== __main__: p = Process(target=work, args=(3,)) p.daemon = True p.start() p.join() print(主進程內) # 輸出結果: # 主進程內 # 說明:子進程都沒有執行到,因為主進程已經結束。

輸出結果:

報錯:

AssertionError: daemonic processes are not allowed to have children    守護進程不能有子進程
守護進程。。。。。
Process Process-1:
Traceback (most recent call last):
  File 
"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap self.run() File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/process.py", line 93, in run self._target(*self._args, **self._kwargs) File "/data/bealla/work/luffy/projects/zuoye/network/test2.py", line 9, in work pp1.start() File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/multiprocessing/process.py", line 103, in start daemonic processes are not allowed to have children AssertionError: daemonic processes are not allowed to have children 主進程內

守護進程練習題:

守護進程在主進程代碼執行完畢後就終止。

from multiprocessing import Process

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=True
    p1.start()
    p2.start()
    print("main-------")

輸出:

技術分享圖片
main-------
456
end456
View Code

5.1.6 守護進程daemon