python子線程如何有序執(zhí)行
一、前情提要
最近在寫一個項目,需要用到子線程,但是我們小學(xué)二年級就學(xué)過操作系統(tǒng), 線程的執(zhí)行是由系統(tǒng)的CPU調(diào)度算法所決定的,調(diào)度算法按照一系列的要求來從 就緒隊列中 選擇合適的線程分配CPU資源。
二、場景重現(xiàn)
好了,換句話說,線程的執(zhí)行順序是不確定的。來個python代碼我們看一下:
import threading
def fun():
'''執(zhí)行函數(shù)'''
print(threading.current_thread().getName()+' 正在執(zhí)行!')
# 線程隊列
ths = []
for i in range(10):
ths.append(threading.Thread(target=fun))
# 依次啟動線程
for th in ths:
th.start()
看一下效果:

不難看出,雖然第一次運(yùn)行的結(jié)果時有序執(zhí)行子線程,但是后續(xù)重復(fù)運(yùn)行程序的結(jié)果,顯然是順序不確定的, 這就正好體現(xiàn)了線程的隨機(jī)性。
那么我們在某種特殊的場景下,我們需要讓子線程按照順序有序執(zhí)行,那改怎么做呢?
三、解決方案(一)
通過查詢threading API我們可以發(fā)現(xiàn)一個這樣的函數(shù):
Thread.join(timeout=None)
該方法的作用是等待當(dāng)前執(zhí)行線程終止
也就是說,哦那我調(diào)用start()方法開始線程之后,再調(diào)用這個方法不就行了嗎?答案是肯定的
import threading
def fun():
'''執(zhí)行函數(shù)'''
print(threading.current_thread().getName()+' 正在執(zhí)行!')
# 線程隊列
ths = []
for i in range(10):
ths.append(threading.Thread(target=fun))
# 依次啟動線程
for th in ths:
th.start()
th.join()
看一下效果:

這時候我們發(fā)現(xiàn),不管如何運(yùn)行子線程的執(zhí)行順序都是有序的
四、解決方案(二)
就這一種方法嗎?當(dāng)然不是的,而且上面那種方法,如果是控制臺界面是沒有問題的,但是如果是GUI界面,那就由大問題了。
那么我們再想想join()方法,還可以換種方法用嗎?
我們可以用一個小技巧,可以將上一個線程傳入target,
在函數(shù)中判斷,如果上一個線程還在執(zhí)行,那么就調(diào)用join()方法等待其執(zhí)行,等待執(zhí)行完畢后,再讓當(dāng)前線程執(zhí)行。
代碼:
import threading
def fun(preThread):
'''執(zhí)行函數(shù)'''
# 等待上一個線程執(zhí)行完畢
if preThread != None:
preThread.join()
# 執(zhí)行當(dāng)前線程
print(threading.current_thread().getName()+' 正在執(zhí)行!')
# 線程隊列
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], )))
# 依次啟動線程
for th in ths:
th.start()
看一下效果:

這個時候,我們發(fā)現(xiàn),子線程的執(zhí)行順序也是有序的!Nice!
五、結(jié)束
通過以上兩種解決方案,完美解決這個問題!
到此這篇關(guān)于python子線程如何有序執(zhí)行的文章就介紹到這了,更多相關(guān)python子線程有序執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mac系統(tǒng)配置python環(huán)境變量兩種方案
這篇文章主要介紹了配置最新Mac電腦上的Python環(huán)境變量的方法,提供了兩種方案,但目前第二種方案似乎無效,大家可以根據(jù)需求了解,需要的朋友可以參考下2025-03-03
Python標(biāo)準(zhǔn)庫之time庫的使用教程詳解
這篇文章主要介紹了Python的time庫的使用教程,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2022-04-04
讀取json格式為DataFrame(可轉(zhuǎn)為.csv)的實例講解
今天小編就為大家分享一篇讀取json格式為DataFrame(可轉(zhuǎn)為.csv)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06

