day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,
六 守护线程
无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁
需要强调的是:运行完毕并非终止运行
#1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
详细解释:
#1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束, #2 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,
而进程必须保证非守护线程都运行完毕后才能结束。
守护进程的应用场景
# 举例说明守护进程的应用场景: # 假设有两个任务要干,要玩出并发的效果,使用进程的话可以让主进程 # 执行一个任务,然后开启一个子进程执行一个任务。 # # 如果这两个任务毫无关系,那么就像上面这么做就可以 # 如果主进程的任务在执行完毕后,子进程的任务没有存在的意义了 # 那么该子进程应该在开启之前就被设置成守护进程
例子
#守护进程的例子 from multiprocessing import Process import os,time,random def task(): print('%s is runing'%(os.getpid(),)) time.sleep(2) print('%s is done'%(os.getpid())) def func(): print('%s is runing'%(os.getpid(),)) time.sleep(2) print('%s is done'%(os.getpid())) if __name__ == '__main__': p1=Process(target=task,) p2 = Process(target=func,) p1.daemon=True #1、必须在p.start()之前 2:守护进程不能开启子进程 p1.start() p2.start() print('zhu') #结果如下,可以看到被守护的进程没有执行出,因为主进程中的代码执行完了 # ,所以被守护的进程被回收了,然而主进程等到非守护进程则继续执行完毕,才会结束进程 """zhu 10024 is runing 10024 is done"""
#守护线程的例子 from threading import Thread import os,time,random def task(): print('%s is run'%(os.getpid(),)) time.sleep(2) print('%s is do'%(os.getpid())) def func(): print('%s is runing'%(os.getpid(),)) time.sleep(1) print('%s is done'%(os.getpid())) if __name__ == '__main__': p1=Thread(target=task,) p2 = Thread(target=func,) p1.daemon=True #1、必须在p.start()之前 p1.start() p2.start() print('zhu') #结果如下,守护线程等所有的非守护线程结束才结束才结束 # 11432 is run # 11432 is runing # zhu # 11432 is done
#迷惑人的例子迷惑人的例子 #主进程代码运行完毕,守护进程就会结束 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=True p1.start() p2.start() print("main-------") #打印该行则主进程代码结束,则守护进程p1应该被终止, # 可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止 #打印结果如下,先打印 main 没有打印P1中的内容,因为主进程中的代码执行完了,所以守护进程就终止了 """main------- 456 end456""" #