Python知識(shí)分享網(wǎng) - 專業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
python多線程 主線程,子線程,任務(wù)講解
發(fā)布于:2023-07-12 16:56:53

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

在之前的一篇博客中我簡(jiǎn)單的介紹了并發(fā),并行

并發(fā):是在時(shí)段的完成多個(gè)任務(wù) ,但是每個(gè)時(shí)間點(diǎn)只有一個(gè)任務(wù)運(yùn)行

而多線程就是這一個(gè)原理

非守護(hù)線程

代碼:

 

from threading import Thread
import requests
from selenium import webdriver
import time
# 并發(fā) cpu數(shù)量小于執(zhí)行任務(wù)數(shù)量 比如一個(gè)cpu運(yùn)行多個(gè)進(jìn)程
# 并行 cpu數(shù)量大于任務(wù)數(shù)量, 比如4個(gè)cpu運(yùn)行4個(gè)進(jìn)程
 
 
def sing():
    # 子線程
    for i in range(5):
        print("我是打打怪")
 
 
def dance():
    # 任務(wù)
    # 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個(gè)子線程,每個(gè)子線程都發(fā)送一次dance()任務(wù),非守護(hù)線程不會(huì)等待主線程運(yùn)行結(jié)束而結(jié)束,而守護(hù)停止是在主線程和非守護(hù)運(yùn)行完成后停止
    for i in range(5):
        t1 = Thread(target=dance)
        # 線程創(chuàng)建按完成
        t1.start()
    b = time.time()
    print(b - a)

 

結(jié)果:

python多線程 主線程,子線程,任務(wù)講解 圖1

可以看出主線程執(zhí)行完成,但是子線程還在運(yùn)行,這就是非守護(hù)線程(子線程),

非守護(hù)線程:就是主線程運(yùn)行結(jié)束,還在運(yùn)行,知道自己調(diào)用的函數(shù)運(yùn)行完成(任務(wù)運(yùn)行完成)

對(duì)于非守護(hù)線程,就算主線程執(zhí)行完了,也要等非守護(hù)進(jìn)程完成才能退出

守護(hù)線程

代碼:

 

from threading import Thread
import requests
from selenium import webdriver
import time
# 并發(fā) cpu數(shù)量小于執(zhí)行任務(wù)數(shù)量 比如一個(gè)cpu運(yùn)行多個(gè)進(jìn)程
# 并行 cpu數(shù)量大于任務(wù)數(shù)量, 比如4個(gè)cpu運(yùn)行4個(gè)進(jìn)程
 
 
def sing():
    # 子線程
    for i in range(5):
        print("我是打打怪")
        time.sleep(5)
        print("子線程(守護(hù))運(yùn)行")
 
 
def dance():
    # 任務(wù)
    # for i in range(5):
    #     print("我是小小怪")
    #     time.sleep(1)
    print("11")
    time.sleep(1)
    print("子線程(非守護(hù))運(yùn)行")
 
 
 
"""主線程"""
if __name__ == '__main__':
    a = time.time()
    # 創(chuàng)建5個(gè)子線程,每個(gè)子線程都發(fā)送一次dance()任務(wù),非守護(hù)線程不會(huì)等待主線程運(yùn)行結(jié)束而結(jié)束,而守護(hù)停止是在主線程和非守護(hù)運(yùn)行完成后停止
 
    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)

 

結(jié)果:

python多線程 主線程,子線程,任務(wù)講解 圖2

守護(hù)線程:要么自己運(yùn)行在主線程或非守護(hù)線程前結(jié)束,要么等主線程或非守護(hù)線程結(jié)束,然后自己被強(qiáng)制行結(jié)束

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

setDaemon(Ture) :設(shè)置子進(jìn)程為守護(hù)進(jìn)程 ==  主進(jìn)程關(guān)閉,子進(jìn)程隨即關(guān)閉【當(dāng)你覺(jué)得一些線程不重要的時(shí)候,可以設(shè)置守護(hù)線程。】

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

這里就不介紹了

總結(jié):這里是給分不清楚主線程和子線程的小可愛(ài)的,
 

轉(zhuǎn)載自:https://blog.csdn.net/m0_69984273/article/details/131302016