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

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

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

這個時候,我們發現,子線程的執行順序也是有序的!Nice!
五、結束
通過以上兩種解決方案,完美解決這個問題!
到此這篇關于python子線程如何有序執行的文章就介紹到這了,更多相關python子線程有序執行內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 解決python父線程關閉后子線程不關閉問題
- Python 多線程,threading模塊,創建子線程的兩種方式示例
- 如何用 Python 子進程關閉 Excel 自動化中的彈窗
- python清理子進程機制剖析
- python使用Queue在多個子進程間交換數據的方法
- Python的子線程和子進程是如何手動結束的?