這一篇博客主要介紹給分不清楚主線程.子線程的小可愛們
在之前的一篇博客中我簡單的介紹了并發(fā),并行
并發(fā):是在時段的完成多個任務 ,但是每個時間點只有一個任務運行
而多線程就是這一個原理
非守護線程
代碼:
from threading import Thread
import requests
from selenium import webdriver
import time
# 并發(fā) cpu數(shù)量小于執(zhí)行任務數(shù)量 比如一個cpu運行多個進程
# 并行 cpu數(shù)量大于任務數(shù)量, 比如4個cpu運行4個進程
def sing():
# 子線程
for i in range(5):
print("我是打打怪")
def dance():
# 任務
# for i in range(5):
# print("我是小小怪")
# time.sleep(1)
print("11")
print("22")
time.sleep(1)
print("33")
"""主線程"""
if __name__ == '__main__':
a = time.time()
# 創(chuàng)建5個子線程,每個子線程都發(fā)送一次dance()任務,非守護線程不會等待主線程運行結束而結束,而守護停止是在主線程和非守護運行完成后停止
for i in range(5):
t1 = Thread(target=dance)
# 線程創(chuàng)建按完成
t1.start()
b = time.time()
print(b - a)
結果:
可以看出主線程執(zhí)行完成,但是子線程還在運行,這就是非守護線程(子線程),
非守護線程:就是主線程運行結束,還在運行,知道自己調用的函數(shù)運行完成(任務運行完成)
對于非守護線程,就算主線程執(zhí)行完了,也要等非守護進程完成才能退出
守護線程
代碼:
from threading import Thread
import requests
from selenium import webdriver
import time
# 并發(fā) cpu數(shù)量小于執(zhí)行任務數(shù)量 比如一個cpu運行多個進程
# 并行 cpu數(shù)量大于任務數(shù)量, 比如4個cpu運行4個進程
def sing():
# 子線程
for i in range(5):
print("我是打打怪")
time.sleep(5)
print("子線程(守護)運行")
def dance():
# 任務
# for i in range(5):
# print("我是小小怪")
# time.sleep(1)
print("11")
time.sleep(1)
print("子線程(非守護)運行")
"""主線程"""
if __name__ == '__main__':
a = time.time()
# 創(chuàng)建5個子線程,每個子線程都發(fā)送一次dance()任務,非守護線程不會等待主線程運行結束而結束,而守護停止是在主線程和非守護運行完成后停止
for i in range(5):
t1 = Thread(target=dance)
# 線程創(chuàng)建按完成
t1.start()
for i in range(5):
t2 = Thread(target=sing)
t2.setDaemon(True)
t2.start()
b = time.time()
print(b - a)
結果:
守護線程:要么自己運行在主線程或非守護線程前結束,要么等主線程或非守護線程結束,然后自己被強制行結束
子線程其實就是并發(fā)(同一時間段內執(zhí)行多個操作)的任務;但本人理解為主線程里面有子線程,通過子線程來執(zhí)行任務,任務就是我們定義的函數(shù)
setDaemon(Ture) :設置子進程為守護進程 == 主進程關閉,子進程隨即關閉【當你覺得一些線程不重要的時候,可以設置守護線程?!?/p>
Join() :設置阻塞 == 該子進程執(zhí)行完才能執(zhí)行主線程【當一些任務要先于另一些任務完成的時候,可以用】
這里就不介紹了
總結:這里是給分不清楚主線程和子線程的小可愛的,