1.線程與進程運行完畢的區別:
1.主進程運行完畢指的是主進程代碼運行完畢
2.主線程運行完畢指的是所在的進程內的所有非守護線程運行完畢后,主線程才算運行完畢
強調:運行完畢,並非是終止
2.守護進程:主進程代碼運行完畢,守護進程也就結束 (守護的是主進程)
主進程要等非守護進程都運行完畢后再回收子進程的資源(否則會產生僵屍進程)才結束
主進程等子進程是因為主進程要給子進程收屍(代用wait方法向操作系統發起回收資源信號(pid號,狀態信息))
守護線程:非守護線程代碼運行完畢,守護線程也就結束 (守護的是非守護線程)
主線程在其他非守護線程運行完畢后才算結束(守護線程在此時就會被回收)
強調:主線程也是非守護線程(進程包含了線程)
總結:
主線程的結束意味着進程結束,進程整體的資源都會被回收,而進程必須保證非守護線程都運行完畢后才能結束
守護進程:主進程代碼運行完畢,守護進程也就結束
守護線程:非守護線程運行完畢,守護線程結束
from threading import Thread, current_thread
import time
# def task():
# print('%s is runing '%current_thread().name)
# time.sleep(2)
# print('%s is done'%current_thread().name)
#
# if __name__ == '__main__':
# t=Thread(target=task,name='守護進程')
# t.daemon=True
# t.start()
# print('主')
def foo():
print(123)
time.sleep(5)
print('end123')
def bar():
print(456)
time.sleep(2)
print('end456') # 守護線程:非守護線程代碼運行結束后就結束
t1 = Thread(target=foo)
t2 = Thread(target=bar)
t1.daemon = True
t1.start()
t2.start()
# t1.join() #讓主線程原地等待子線程運行完畢后才運行下面代碼
print('main----')# 守護線程:非守護線程代碼運行結束后就結束
t1 = Thread(target=foo)
t2 = Thread(target=bar)
t1.daemon = True
t1.start()
t2.start()
# t1.join() #讓主線程原地等待子線程運行完畢后才運行下面代碼
print('main----')
