一、setDaemon(False)當一個進程啟動之後,會默認產生一個主線程,因為線程是程序執行的最小單位,當設置多線程時,主線程會創建多個子線程,在python中,默認情況下就是setDemon(False),主線程執行完自己的任務之後,就退出了,此時子線程會繼續執行自己的任務,知道自己的任務結束。
import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.start()
print('主線程執行完畢')
執行結果:
子線程0開始執行主線程執行完畢
子線程0結束執行
子線程1開始執行
子線程1結束執行
子線程2開始執行
子線程2結束執行
子線程3開始執行
子線程3結束執行
子線程4開始執行
子線程4結束執行
二、setDaemon(True) 當我們使用setDaemon(True)時,這是子線程為守護線程,主線程一旦執行結束,則全部子線程被強制終止
import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.setDaemon(True)
t.start()
print('主線程執行完畢')
執行結果:
子線程0開始執行主線程執行完畢
三、 join(線程同步): join 所完成的工作就是線程同步,即主線程任務結束以後,進入堵塞狀態,一直等待所有的子線程結束以後,主線程再終止。
如果不設置timeout參數就等子線程結束主線程再結束
import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.start()
t.join()
print('主線程執行完畢')
執行結果:
子線程0開始執行
子線程0結束執行
子線程1開始執行
子線程1結束執行
子線程2開始執行
子線程2結束執行
子線程3開始執行
子線程3結束執行
子線程4開始執行
子線程4結束執行
主線程執行完畢
import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.start()
t.join(timeout=3)
print('主線程執行完畢')
執行結果:主線程堵塞3s後,主線程結束執行,子線程繼續執行。
子線程0開始執行
子線程0結束執行
子線程1開始執行
主線程執行完畢
子線程1結束執行
子線程2開始執行
子線程2結束執行
子線程3開始執行
子線程3結束執行
子線程4開始執行
子線程4結束執行
import threading
import time
def thread():
for i in range(5):
print(f'子線程{
i}開始執行')
time.sleep(2)
print(f'子線程{
i}結束執行')
if __name__ == '__main__':
t=threading.Thread(target=thread)
t.setDaemon(True)
t.start()
t.join(timeout=3)
print('主線程執行完畢')
執行結果:主線程堵塞3s後,主線程結束任務,子線程也強制結束任務
子線程0開始執行
子線程0結束執行
子線程1開始執行
主線程執行完畢