濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > python子線程如何有序執(zhí)行

python子線程如何有序執(zhí)行

熱門標(biāo)簽:手機(jī)網(wǎng)頁(yè)嵌入地圖標(biāo)注位置 地圖標(biāo)注線上如何操作 河北防封卡電銷卡 開封自動(dòng)外呼系統(tǒng)怎么收費(fèi) 400電話辦理哪種 應(yīng)電話機(jī)器人打電話違法嗎 開封語音外呼系統(tǒng)代理商 電銷機(jī)器人的風(fēng)險(xiǎn) 天津電話機(jī)器人公司

一、前情提要

最近在寫一個(gè)項(xiàng)目,需要用到子線程,但是我們小學(xué)二年級(jí)就學(xué)過操作系統(tǒng), 線程的執(zhí)行是由系統(tǒng)的CPU調(diào)度算法所決定的,調(diào)度算法按照一系列的要求來從 就緒隊(duì)列中 選擇合適的線程分配CPU資源。

二、場(chǎng)景重現(xiàn)

好了,換句話說,線程的執(zhí)行順序是不確定的。來個(gè)python代碼我們看一下:

import threading

def fun():
    '''執(zhí)行函數(shù)'''
    print(threading.current_thread().getName()+' 正在執(zhí)行!')

# 線程隊(duì)列
ths = []
for i in range(10):
    ths.append(threading.Thread(target=fun))
# 依次啟動(dòng)線程
for th in ths:
    th.start()

看一下效果:

不難看出,雖然第一次運(yùn)行的結(jié)果時(shí)有序執(zhí)行子線程,但是后續(xù)重復(fù)運(yùn)行程序的結(jié)果,顯然是順序不確定的, 這就正好體現(xiàn)了線程的隨機(jī)性。

那么我們?cè)谀撤N特殊的場(chǎng)景下,我們需要讓子線程按照順序有序執(zhí)行,那改怎么做呢?

三、解決方案(一)

通過查詢threading API我們可以發(fā)現(xiàn)一個(gè)這樣的函數(shù):

Thread.join(timeout=None)

該方法的作用是等待當(dāng)前執(zhí)行線程終止

也就是說,哦那我調(diào)用start()方法開始線程之后,再調(diào)用這個(gè)方法不就行了嗎?答案是肯定的

import threading

def fun():
    '''執(zhí)行函數(shù)'''
    print(threading.current_thread().getName()+' 正在執(zhí)行!')

# 線程隊(duì)列
ths = []
for i in range(10):
    ths.append(threading.Thread(target=fun))
# 依次啟動(dòng)線程
for th in ths:
    th.start()
    th.join()

看一下效果:

這時(shí)候我們發(fā)現(xiàn),不管如何運(yùn)行子線程的執(zhí)行順序都是有序的

四、解決方案(二)

就這一種方法嗎?當(dāng)然不是的,而且上面那種方法,如果是控制臺(tái)界面是沒有問題的,但是如果是GUI界面,那就由大問題了。

那么我們?cè)傧胂?code>join()方法,還可以換種方法用嗎?

我們可以用一個(gè)小技巧,可以將上一個(gè)線程傳入target,

在函數(shù)中判斷,如果上一個(gè)線程還在執(zhí)行,那么就調(diào)用join()方法等待其執(zhí)行,等待執(zhí)行完畢后,再讓當(dāng)前線程執(zhí)行。

代碼:

import threading

def fun(preThread):
    '''執(zhí)行函數(shù)'''
    # 等待上一個(gè)線程執(zhí)行完畢
    if preThread != None:
        preThread.join()
    # 執(zhí)行當(dāng)前線程
    print(threading.current_thread().getName()+' 正在執(zhí)行!')

# 線程隊(duì)列
ths = []
for i in range(10):
    if i == 0:
        ths.append(threading.Thread(target=fun, args=(None, )))
    else :
        ths.append(threading.Thread(target=fun, args=(ths[-1], )))
# 依次啟動(dòng)線程
for th in ths:
    th.start()

看一下效果:

這個(gè)時(shí)候,我們發(fā)現(xiàn),子線程的執(zhí)行順序也是有序的!Nice!

五、結(jié)束

通過以上兩種解決方案,完美解決這個(gè)問題!

到此這篇關(guān)于python子線程如何有序執(zhí)行的文章就介紹到這了,更多相關(guān)python子線程有序執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 解決python父線程關(guān)閉后子線程不關(guān)閉問題
  • Python 多線程,threading模塊,創(chuàng)建子線程的兩種方式示例
  • 如何用 Python 子進(jìn)程關(guān)閉 Excel 自動(dòng)化中的彈窗
  • python清理子進(jìn)程機(jī)制剖析
  • python使用Queue在多個(gè)子進(jìn)程間交換數(shù)據(jù)的方法
  • Python的子線程和子進(jìn)程是如何手動(dòng)結(jié)束的?

標(biāo)簽:成都 蘭州 江蘇 常州 山東 六盤水 宿遷 駐馬店

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python子線程如何有序執(zhí)行》,本文關(guān)鍵詞  python,子,線程,如何,有序,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python子線程如何有序執(zhí)行》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于python子線程如何有序執(zhí)行的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    浙江省| 宝应县| 富阳市| 邳州市| 塔城市| 海门市| 柳州市| 洛川县| 吴旗县| 包头市| 上虞市| 高州市| 旅游| 奈曼旗| 赤城县| 信丰县| 彭水| 德惠市| 汕头市| 定西市| 林芝县| 巧家县| 河西区| 旅游| 凤冈县| 抚远县| 陆川县| 丹巴县| 东辽县| 南皮县| 公主岭市| 澄迈县| 札达县| 临海市| 阳春市| 巫山县| 时尚| 鄂尔多斯市| 锦屏县| 郓城县| 岢岚县|