人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

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

發(fā)布日期:2022-04-08 12:36 | 文章來源:腳本之家

一、前情提要

最近在寫一個項目,需要用到子線程,但是我們小學二年級就學過操作系統(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()

看一下效果:

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

那么我們在某種特殊的場景下,我們需要讓子線程按照順序有序執(zhí)行,那改怎么做呢?

三、解決方案(一)

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

Thread.join(timeout=None)

該方法的作用是等待當前執(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),不管如何運行子線程的執(zhí)行順序都是有序的

四、解決方案(二)

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

那么我們再想想join()方法,還可以換種方法用嗎?

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

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

代碼:

import threading
def fun(preThread):
 '''執(zhí)行函數(shù)'''
 # 等待上一個線程執(zhí)行完畢
 if preThread != None:
  preThread.join()
 # 執(zhí)行當前線程
 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)文章希望大家以后多多支持本站!

香港穩(wěn)定服務(wù)器

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部