亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

改變 Python 中線程執(zhí)行順序的方法

瀏覽:17日期:2022-07-10 10:03:15

一、主線程會(huì)等待所有的子線程結(jié)束后才結(jié)束

首先我看下最普通情況下,主線程和子線程的情況。

import threadingfrom time import sleep, ctimedef sing(): for i in range(3): print('正在唱歌...%d' % i) sleep(1)def dance(): for i in range(3): print('正在跳舞...%d' % i) sleep(1)if __name__ == ’__main__’: print(’---開始---:%s’ % ctime()) t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance) t1.start() t2.start() print(’---結(jié)束---:%s’ % ctime())

運(yùn)行結(jié)果:

改變 Python 中線程執(zhí)行順序的方法

最后一行打印的代碼就算在一開始運(yùn)行了,程序也不會(huì)結(jié)束。

只有等待所有的子線程(sing 和 dance)都執(zhí)行完畢,主線程才會(huì)結(jié)束,即程序結(jié)束。

二、默認(rèn)狀態(tài)下,多線程的執(zhí)行順序是不確定的

我們先來看一段代碼:

import threadingimport timeclass MyThread(threading.Thread): def run(self): for i in range(3): time.sleep(1) msg = 'I’m '+self.name+’ @ ’+str(i) print(msg)def test(): for i in range(5): t = MyThread() t.start()if __name__ == ’__main__’: test()

運(yùn)行結(jié)果:

I’m Thread-1 @ 0I’m Thread-2 @ 0I’m Thread-3 @ 0I’m Thread-4 @ 0I’m Thread-5 @ 0I’m Thread-1 @ 1I’m Thread-3 @ 1I’m Thread-2 @ 1I’m Thread-4 @ 1I’m Thread-5 @ 1I’m Thread-1 @ 2I’m Thread-3 @ 2I’m Thread-2 @ 2I’m Thread-4 @ 2I’m Thread-5 @ 2

每次的運(yùn)行結(jié)果可能都不一樣,但大體差不多。

說明:

從代碼和執(zhí)行結(jié)果我們可以看出,多線程程序的執(zhí)行順序是不確定的。

當(dāng)執(zhí)行到 sleep 語句時(shí),線程將被阻塞,到 sleep 結(jié)束后,線程進(jìn)入就緒狀態(tài),等待調(diào)度,而線程調(diào)度將自行選擇一個(gè)線程執(zhí)行。

上面的代碼中只能保證每個(gè)線程都運(yùn)行完整個(gè) run 函數(shù),但是線程的啟動(dòng)順序、run 函數(shù)中每次循環(huán)的執(zhí)行順序都不能確定。

總結(jié)

每個(gè)線程默認(rèn)有一個(gè)名字,盡管上面的例子中沒有指定線程對象的 name,但是 python 會(huì)自動(dòng)為線程指定一個(gè)名字。

當(dāng)線程的 run() 方法結(jié)束時(shí)該線程完成。

無法控制線程調(diào)度程序,但可以通過別的方式來影響線程調(diào)度的方式。

三、Python daemon 守護(hù)線程詳解

當(dāng)程序中擁有多個(gè)線程時(shí),主線程執(zhí)行結(jié)束并不會(huì)影響子線程繼續(xù)執(zhí)行。

換句話說,只有程序中所有線程全部執(zhí)行完畢后,程序才算真正結(jié)束。

Python 還支持創(chuàng)建另一種線程,稱為守護(hù)線程(或后臺線程)。

此類線程的特點(diǎn)是,當(dāng)程序中主線程及所有非守護(hù)線程執(zhí)行結(jié)束時(shí),未執(zhí)行完畢的守護(hù)線程也會(huì)隨之消亡,程序?qū)⒔Y(jié)束運(yùn)行。

守護(hù)線程本質(zhì)也是線程,因此其創(chuàng)建方式和普通線程一樣,唯一不同之處在于,將普通線程設(shè)為守護(hù)線程,需通過線程對象調(diào)用其 damon 屬性,將該屬性的值改為 True。

注意:線程對象調(diào)用 daemon 屬性必須在調(diào)用 start() 方法之前,否則 Python 解釋器將報(bào) RuntimeError 錯(cuò)誤。

import threadingdef action(len): for i in range(len): print(threading.current_thread().getName() + ',' + str(i))def main(): t1 = threading.Thread(target=action, args=(10,)) # 設(shè)置子線程為守護(hù)進(jìn)程 t1.daemon = True t1.start() for i in range(3): print(threading.current_thread().getName()+’,’+str(i))if __name__ == '__main__': main()

運(yùn)行結(jié)果:

Thread-1,0MainThread,0MainThread,1MainThread,2

程序中,子線程里的程序就循環(huán)了一次,接著主線程執(zhí)行完后,子線程就不打印信息了。

由于該程序中除了守護(hù)線程就只有主線程,因此只要主線程執(zhí)行結(jié)束,則守護(hù)線程也隨之消亡。

四、控制線程執(zhí)行順序

通過前面的學(xué)習(xí)我們知道,主線程和子線程會(huì)輪流獲得 CPU 的資源。

但有時(shí)候,我們想讓某個(gè)子線程先執(zhí)行,然后再讓主線程執(zhí)行代碼,該如何實(shí)現(xiàn)呢?

很簡單,通過調(diào)用線程對象的 join() 方法即可。

join() 方法的功能是在程序指定位置,優(yōu)先讓該方法的調(diào)用者使用 CPU 資源。

該方法的語法格式如下:

thread.join( [timeout] )

timeout 參數(shù)作為可選參數(shù),其功能是指定 thread 線程最多可以霸占 CPU 資源的時(shí)間(以秒為單位)。

如果省略,則默認(rèn)直到 thread 執(zhí)行結(jié)束(進(jìn)入死亡狀態(tài))才釋放 CPU 資源。

我們?nèi)耘f拿上面的例子來舉例:

import threadingdef action(len): for i in range(len): print(threading.current_thread().getName() + ',' + str(i))def main(): t1 = threading.Thread(target=action, args=(10,)) # 設(shè)置子線程為守護(hù)進(jìn)程 t1.daemon = True t1.start() t1.join() for i in range(3): print(threading.current_thread().getName()+’,’+str(i))if __name__ == '__main__': main()

我們在子線程調(diào)用的后面,添加了 t1.join()。

運(yùn)行結(jié)果:

Thread-1,0Thread-1,1Thread-1,2Thread-1,3Thread-1,4Thread-1,5Thread-1,6Thread-1,7Thread-1,8Thread-1,9MainThread,0MainThread,1MainThread,2

上面的例子中,t1 線程調(diào)用了 join() 方法,并且沒有指定具體的 timeout 參數(shù)值。

這意味著如果程序想繼續(xù)往下執(zhí)行,必須先執(zhí)行完 t1 子線程。

以上就是改變 Python 中線程的執(zhí)行順序的方法的詳細(xì)內(nèi)容,更多關(guān)于改變 Python 中線程的執(zhí)行順序的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: www噜噜偷拍在线视频 | 丁香六月纪婷婷激情综合 | 美国一级特级毛片片aa视频 | 91精品国产人成网站 | 三级久久| 色秀影院| 国产精品亚洲综合第一区 | 伊人婷婷色 | 人做人爱全免费视频 | 伊人久久视频 | 成人午夜精品视频在线观看 | 国产免费全部免费观看 | 91亚洲在线 | 欧美亚洲午夜 | 日韩一级一欧美一级国产 | zoofilia杂交videos新另类 | 正在播放的国产a一片 | 国产福利视频 | 激情欧美一区二区三区 | 美女被啪到深处喷水gif动态图视频 | 欧美日韩在线看 | 日日噜噜夜夜狠狠tv视频免费 | 在线视频欧美日韩 | 大陆一级毛片免费视频观看 | 成人免费国产欧美日韩你懂的 | 亚洲色图视频在线 | 日本一级大黄毛片一级 | 免费黄色一级视频 | 韩国亚洲伊人久久综合影院 | 成年女人毛片免费视频永久vip | 美国一级特级毛片片aa视频 | 干成人| 国产二区视频在线观看 | 国产亚洲精品sese在线播放 | 丁香五月网久久综合 | 国产日产欧美一区二区三区 | 亚洲一区区 | 美女扒开胸露出奶乳免费 | 国产这里有精品 | 婷婷综合七月激情啪啪 | 最新亚洲精品国自产在线 |