深圳 微网站,婚恋网站建设项目创业计划书,icp网站备案,商务网站建设的第一步1、守护子进程
主进程创建守护进程
其一#xff1a;守护进程会在主进程代码执行结束后就终止其二#xff1a;守护进程内无法再开启子进程,否则抛出异常#xff1a;AssertionError: daemonic processes are not allowed to havechildren
注意#xff1a;进程之间是互相独立…1、守护子进程
主进程创建守护进程
其一守护进程会在主进程代码执行结束后就终止其二守护进程内无法再开启子进程,否则抛出异常AssertionError: daemonic processes are not allowed to havechildren
注意进程之间是互相独立的主进程代码运行结束守护进程随即终止
我们来看一个例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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(targettime.sleep, args(3,)) # p.start() if __name__ __main__: pProcess(targettask) p.daemon True #1、必须在p.start()之前 p.start() print(主)
输出结果如下 主 原因是主进程程序启动执行到p子进程由于子进程需要开辟内存空间由于需要耗费时间所以主进程会首先输出“主”由于主进程执行完毕那么守护子进程p也就被干掉了随之主进程也就退出了
如果上面代码修改如下加上 p.join()这一行代码 1 2 3 4 5 6 if __name__ __main__: pProcess(targettask) p.daemon True #1、必须在p.start()之前 p.start() p.join() print(主)
那么程序会输出如下 14732 is running 14732 is done 主 join以前也分析过是起到阻塞作用子进程执行完毕才执行主进程所以加上join
1、执行到join是起到阻塞作用就会执行子进程然后执行完毕在执行主进程
2、也可以这样理解执行到join由于主进程print(“主”)没有执行完所以守护进程不会被干掉继续执行
1、守护子进程、非守护子进程并存
在上面的例子是子进程只有一个守护进程在主进程执行完毕守护子进程就会被干掉 我们在来看一个子进程既有守护子进程又包含非守护子进程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from multiprocessing import Process from threading import Thread import time,os def foo(): print(123) time.sleep(1) print(end123) def bar(): print(456) time.sleep(3) print(end456) if __name__ __main__: p1Process(targetfoo) p2 Process(targetbar) p1.daemonTrue p1.start() p2.start() print(main-------)
输出如下 main------- 456 end456 原因如下:由于p1,p2都是子进程需要开辟内存空间需要耗费时间所以会优先输出主进程“main”,由于p1是守护子进程p2是非守护子进程当主进程执行完毕注意之类主进程还没有退出因为还有p2非守护进程p1守护进程也就退了但是还有一个p2非守护进程所以p2会执行自己的代码任务当p2执行完毕那么主进程也就退出了进而整个程序就退出了
守护线程
守护子线程
无论是进程还是线程都遵循守护xxx会等待主xxx运行完毕后被销毁
需要强调的是运行完毕并非终止运行
1.对主进程来说运行完毕指的是主进程代码运行完毕
2.对主线程来说运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕主线程才算运行完毕
详细解释
1 主进程在其代码结束后就已经算运行完毕了守护进程在此时就被回收,然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程)才会结束
2 主线程在其他非守护线程运行完毕后才算运行完毕守护线程在此时就被回收。因为主线程的结束意味着进程的结束进程整体的资源都将被回收而进程必须保证非守护线程都运行完毕后才能结束。
我们先来看一个例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from multiprocessing import Process from threading import Thread import os,time,random def task(): # tThread(targettime.sleep,args(3,)) # t.start() print(%s is running %os.getpid()) time.sleep(2) print(%s is done %os.getpid()) if __name__ __main__: tThread(targettask) t.daemon True t.start() print(主) 输出如下 13368 is running 主 原因是
在执行到守护子线程t由于主线程子线程通用一块内存所以不存在不同进程创建各自空间所以就先输出子进程的执行任务代码所以输出print(‘%s is running %os.getpid())由于time.sleep(2)所以就会执行主线程“main”,然后主线程执行完毕那么即使2秒过后由于主线程执行完毕那么子守护线程也就退出了所以 print(‘%s is done %os.getpid())就不会执行了
守护子线程非守护子进程并存
我们解析来看一个守护子线程非守护子进程并存的例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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__: t1Thread(targetfoo) t2 Thread(targetbar) t1.daemonTrue t2.start() t1.start() print(main-------)
输出如下 456 123 main------- end123 end456 原因是
t1是守护子线程t2非守护子线程跟主线程使用一块内存所以会输出t1,t1子线程的任务代码所以执行456123由于t1,t2都有睡眠时间所以执行主线程代码然后对主线程来说运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕主线程才算运行完毕所以会执行t1,t2睡眠后的任务代码然后程序退出。
我们会问为什么t1守护子线程也会执行sleep后的代码不是说主线程代码执行完毕守护线程就被干掉了吗这里要注意是对主线程来说运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕主线程才算运行完毕当时t2还没执行完毕
最后根据这篇文章谈谈我对主线程和子线程的理解
主线程就是程序本身执行所开启的线程子线程就是在程序中利用语句建立的线程。
参考自https://www.jb51.net/article/139521.htm