主进程与子进程之间各自执行, 互不干扰.
主进程 代码 执行完毕后, 程序本身不会结束, 主进程会等到 所有的子进程结束之后 才结束. 因为, 主进程要负责给子进程回首一些系统资源.
而守护进程本身是一个子进程, 守护的是主进程(的代码).
守护进程:
守护进程结束的条件是: 主进程的 代码 结束, 守护进程跟着结束.
看代码现象:
import time from multiprocessing import Process def func(): for i in range(20): time.sleep(0.5) print('in func') if __name__ == '__main__': p = Process(target=func) p.daemon = True # 表示设置p为一个守护进程 p.start() print('in main') time.sleep(2) print('finished') #打印结果为 """ in main in func in func in func finished """
import time from multiprocessing import Process def func(): for i in range(20): time.sleep(0.5) print('in func') def func2(): print('start : func2') time.sleep(4) print('end : func2') if __name__ == '__main__': p = Process(target=func) p.daemon = True # 表示设置p为一个守护进程 p.start() p2 =Process(target=func2) p2.start() print('in main') time.sleep(2) print('finished') p2.join() #打印结果为 """ in main start : func2 in func in func in func finished in func in func in func in func in func end : func2 """
守护线程:
守护线程守护主线程, 主线程结束, 守护线程随之结束.而主线程结束,意味着进程结束. 进程若结束, 那么其他所有的子线程都会结束,
所以 主线程只有等到所有非守护线程结束后, 才能结束.
守护线程结束的本质:
所有非守护线程结束后, 主线程才结束. 主线程结束意味着主进程结束.主进程结束,守护线程被强制结束.
看代码:
import time from threading import Thread def daemon_func(): while True: time.sleep(0.5) print('守护线程') def son_func(): print('start son') time.sleep(5) print('end son') t = Thread(target=daemon_func) t.daemon = True t.start() Thread(target=son_func).start() time.sleep(3) print('主线程结束') #打印结果 """ start son 守护线程 守护线程 守护线程 守护线程 守护线程 主线程结束 守护线程 守护线程 守护线程 守护线程 end son """
总结:
守护进程 :只会守护到主进程的代码结束
守护线程 :会守护所有其他非守护线程的结束