python 并发编程 多线程 守护线程
做完工作这个进程就应该被销毁
单线程情况:
一个进程 ,默认有一个主线程 ,这个主线程执行完代码后 ,就应该自动销毁。然后进程也销毁。
多线程情况:
主线程代表进程结束
一个进程可以开多个线程,默认开启进程 ,首先开一个主线程 ,然后开子线程 ,主线程代码执行完毕后 ,也要等所有子线程 ,执行完毕后 ,再销毁 ,然后到进程销毁。
守护进程 要等主进程挂了后 守护进程才挂
1、对主进程来说,运行完毕指的是主进程代码运行完毕
2、对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
主进程代码执行完后 ,守护进程就挂了
1、主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,
2、主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,
而进程必须保证非守护线程都运行完毕后才能结束。
守护线程守护着对象是主线程
守护线程盯着主线程 主线程一挂 守护线程就挂
总结 守护线程 ,就是等到进程内所有非守护线程运行完毕后 ,守护线程才销毁。
没有非守护线程 只有一个主线程情况下
开启守护线程方法一
t.setdaemon(True)
from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t = Thread(target=sayhi,args=('子线程',)) t.setDaemon(True) # 必须在t.start()之前设置 t.start() print('主线程') print(t.is_alive()) ''' 主线程 True '''
开启守护线程方法二
t.daemon = True
from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t = Thread(target=sayhi,args=('子线程',)) t.daemon = True # 必须在t.start()之前设置 t.start() print('主线程') print(t.is_alive()) ''' 主线程 True '''
子线程没有执行sayhi函数的代码,代表子线程已经死了
有非守护线程情况下
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__': t1 = Thread(target=foo) t2 = Thread(target=bar) t1.daemon = True t1.start() t2.start() print("main-------") # 非守护线程是t2 主线程 t1是守护线程 # 守护线程 等所有非守护线程执行完毕后 再销毁 ''' 首先t1.start,t2.start 开启线程都是很快执行 所以打印123 然后t1 time.sleep ,打印t2的456 ,t2也time.sleep了, 然后打印主的消息 main 这种情况是 守护线程t1 在t2 执行最后一行代码前就死了 因为 t2 的time.sleep 3秒 t1 1秒 时间早就过了 所以t1先执行最后一行代码 ''' ''' 123 456 main------- end123 end456 '''