Python知識分享網 - 專業(yè)的Python學習網站 學Python,上Python222
python多線程 主線程,子線程,任務講解
匿名網友發(fā)布于:2023-07-12 16:56:53
(侵權舉報)

這一篇博客主要介紹給分不清楚主線程.子線程的小可愛們

在之前的一篇博客中我簡單的介紹了并發(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)

 

結果:

python多線程 主線程,子線程,任務講解 圖1

可以看出主線程執(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)

 

結果:

python多線程 主線程,子線程,任務講解 圖2

守護線程:要么自己運行在主線程或非守護線程前結束,要么等主線程或非守護線程結束,然后自己被強制行結束

子線程其實就是并發(fā)(同一時間段內執(zhí)行多個操作)的任務;但本人理解為主線程里面有子線程,通過子線程來執(zhí)行任務,任務就是我們定義的函數(shù)

setDaemon(Ture) :設置子進程為守護進程 ==  主進程關閉,子進程隨即關閉【當你覺得一些線程不重要的時候,可以設置守護線程?!?/p>

 Join() :設置阻塞 == 該子進程執(zhí)行完才能執(zhí)行主線程【當一些任務要先于另一些任務完成的時候,可以用】

這里就不介紹了

總結:這里是給分不清楚主線程和子線程的小可愛的,
 

轉載自:https://blog.csdn.net/m0_69984273/article/details/131302016