守护进程,守护线程
创建守护进程
其一:守护进程会在主进程代码执行结束后就终止
其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children
注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止
代码及现象
from multiprocessing import Process import os,time,random def task(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.getpid()) if __name__ == '__main__': p=Process(target=task) p.daemon = True #1、必须在p.start()之前 2:守护进程不能开启子进程 p.start() # p.join() print('主') #结果 #主
from multiprocessing import Process import os,time,random def task(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.getpid()) p = Process(target=time.sleep, args=(3,)) p.start() if __name__ == '__main__': p=Process(target=task) p.daemon = True #1、必须在p.start()之前 2:守护进程不能开启子进程 p.start() p.join() #这里要等一下,否则主进程很快就完,看不出现象 print('主') #结 11720 is running 11720 is done Process Process-1: Traceback (most recent call last): File "C:\Python36\lib\multiprocessing\process.py", line 258, in _bootstrap self.run() File "C:\Python36\lib\multiprocessing\process.py", line 93, in run self._target(*self._args, **self._kwargs) File "D:\视频\day32\day34\1 守护进程vs守护线程.py", line 10, in task p.start() File "C:\Python36\lib\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
创建守护线程
from threading import Thread import os,time,random def task(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.getpid()) # p = Thread(target=time.sleep, args=(3,)) # p.start() if __name__ == '__main__': p=Thread(target=task) p.daemon = True #1、必须在p.start()之前 2:守护线程可以开启子进程 p.start() print('主') #运行结果 #6120 is running #主
from threading import Thread import os,time,random def task(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.getpid()) p = Thread(target=print, args=("子线程中的子线程",)) p.start() if __name__ == '__main__': p=Thread(target=task) p.daemon = True #1、必须在p.start()之前 2:守护进程不能开启子进程 p.start() p.join() print('主') #结果 #14368 is running #14368 is done #子线程中的子线程 #主
守护线程与子线程共存
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=Thread(target=foo) p2 = Thread(target=bar) p1.daemon=True p1.start() p2.start() print("main-------") #结果 #123 #456 #main------- #end123 #end456
守护进程和守护线程的结束
守护进程的结束:
主进程代码执行完毕,或者自己结束
守护线程的结束:
控制线程结束,或者自己结束
主进程和控制线程的代码执行完毕不意味着结束,主进程结束要等非守护子进程全部结束,回收资源。控制线程要等非守护线程全部结束才能结束,
控制线程结束意味着进程结束,进程要等其中所有的非守护线程结束才能结束。

浙公网安备 33010602011771号