Python?threading和Thread模塊及線程的實(shí)現(xiàn)
前言
- 進(jìn)程: 打開(kāi)一個(gè)程序至少會(huì)有一個(gè)進(jìn)程 它是cpu調(diào)度的最小的單位。
- 線程: 程序執(zhí)行的最小單位,一個(gè)進(jìn)程里面至少有一個(gè)線程,cpu會(huì)控制進(jìn)程里面的線程。
打個(gè)比方:
- (1)打開(kāi)一個(gè)qq就是一個(gè)進(jìn)程的話,那么你可以同時(shí)和好多人聊天,和一個(gè)人聊天這就是一個(gè)線程。
- (2)再打個(gè)比方,一條直行的高速公路,分好幾個(gè)車道,這整個(gè)告訴公路就相當(dāng)于一個(gè)進(jìn)程,那些車道就相當(dāng)于一個(gè)個(gè)線程,如果有一條車道上的車拐彎,別的車道的車就要等待,不然就撞車了。
注意:
- (1)一個(gè)cpu同一時(shí)間只能處理一件事,如果同時(shí)有多個(gè)任務(wù),那么就輪換著執(zhí)行,但是每個(gè)任務(wù)執(zhí)行的時(shí)間非常短暫,無(wú)法感受到。
- (2)使用線程的時(shí)候,不管它的順序,因?yàn)閏pu是隨機(jī)調(diào)度的。
- (3)一個(gè)程序的執(zhí)行,就會(huì)有一個(gè)主線程
1. 線程
1.1 線程模塊
- Python通過(guò)兩個(gè)標(biāo)準(zhǔn)庫(kù)thread 和threading提供對(duì)線程的支持 , threading對(duì)thread進(jìn)行了封裝。threading模塊中提供了Thread , Lock , RLock , Condition等組件。
- 因此在實(shí)際的使用中我們一般都是使用threading。
1.1.1 Thread類
常用參數(shù)說(shuō)明:
- target:表示調(diào)用對(duì)象,即子線程要執(zhí)行的任務(wù)。
- name:子線程的名稱。
- args:傳入target函數(shù)中的位置參數(shù),是一個(gè)元組,必須加逗號(hào)。
常用實(shí)例方法:
Thread.run(self)
線程啟動(dòng)時(shí)運(yùn)行的方法,由該方法調(diào)用target參數(shù)所指定的函數(shù)。
Thread.start(self)
啟動(dòng)線程,start方法就是去幫你調(diào)用run方法。
Thread.terminate(self)
強(qiáng)制終止線程。
Thread.join(self, timeout=None)
阻塞調(diào)用,主線程進(jìn)行等待。
Thread.setDaemon(self, daemonic)
將子線程設(shè)置為守護(hù)線程。
Thread.getName(self, name)
獲取線程名稱。
Thread.setName(self, name)
設(shè)置線程名稱:
但是剛剛也講了實(shí)際使用中我們都是使用的threading模塊,所以此處只是簡(jiǎn)單介紹一下Thread類,下面講解都是使用的threading模塊!
1.2 創(chuàng)建線程
在python中創(chuàng)建線程有兩種方式:
- 實(shí)例Thread類;
- 繼承重寫Thread類。
1.2.1 實(shí)例Thread類法創(chuàng)建線程
(需要注意的是:下面在主線程里添加了t1,t2兩個(gè)子線程,①如果沒(méi)有設(shè)置setDaemon守護(hù)線程,那么整個(gè)文件順序執(zhí)行完[即主線程]之后,對(duì)應(yīng)的兩個(gè)子線程并行執(zhí)行;②如果設(shè)置了守護(hù)線程,那么對(duì)應(yīng)的設(shè)置了守護(hù)線程的子線程在主線程執(zhí)行完之后立馬被殺死!)
# -*- coding: utf-8 -*- import threading import time # 定義線程要運(yùn)行的函數(shù) def sing(): # 為了便于觀察,sleep1秒 for i in range(5): print("正在唱歌......") time.sleep(1) def dance(): # 為了便于觀察,sleep1秒 for i in range(5): print("正在跳舞......") time.sleep(1) if __name__ == '__main__': # 創(chuàng)建兩個(gè)線程實(shí)例 t1 = threading.Thread(target=sing) t2 = threading.Thread(target=dance) # 設(shè)置守護(hù)線程 t1.setDaemon(True) # 守護(hù)線程:把子線程作為主線程的守護(hù)線程 t2.setDaemon(True) # 啟動(dòng)線程 t1.start() t2.start() print('主線程結(jié)束')
未設(shè)置t1,t2為守護(hù)線程時(shí)的輸出:
設(shè)置t1,t2為守護(hù)線程時(shí)的輸出:
1.2.1 繼承重寫Thread類法創(chuàng)建線程
# -*- coding: utf-8 -*- import threading import time # 繼承threading中的Thread類 class MyThread(threading.Thread): # 線程中所需要的參數(shù) def __init__(self, name): super().__init__() self.name = name # 重構(gòu)run方法,注意這個(gè)是表示線程活動(dòng)的方法,必須有! def run(self): print('I am %s' % self.name) time.sleep(2) # 創(chuàng)建線程實(shí)例 t1 = MyThread('guhanzhe') t2 = MyThread('coolboy') # 啟動(dòng)線程 t1.start() t2.start() # 打印線程名 print(t1.getName()) print(t2.getName())
1.3 Join & setDaemon
在說(shuō)這兩個(gè)方法之前 , 需要知道主線程與子線程的概念:
- 主線程 : 當(dāng)一個(gè)程序啟動(dòng)時(shí) , 就有一個(gè)線程開(kāi)始運(yùn)行 , 該線程通常叫做程序的主線程。
- 子線程 : 因?yàn)槌绦蚴情_(kāi)始時(shí)就執(zhí)行的 , 如果你需要再創(chuàng)建線程 , 那么創(chuàng)建的線程就是這個(gè)主線程的子線程。
主線程的重要性體現(xiàn)在兩方面 :
- 是產(chǎn)生其他子線程的線程;
- 通常它必須最后完成執(zhí)行比如執(zhí)行各種關(guān)閉操作。
1.3.1 join
- join : 阻塞調(diào)用程序 , 直到調(diào)用join () 方法的線程執(zhí)行結(jié)束, 才會(huì)繼續(xù)往下執(zhí)行。
# -*- coding: utf-8 -*- import threading import time def run(name): print('I am %s' % name) time.sleep(2) print('子線程結(jié)束......') t1 = threading.Thread(target=run, args=('guhanzhe', )) t1.start() # 阻塞主線程,等待子線程運(yùn)行結(jié)束 t1.join() print('主線程結(jié)束......')
大家可以嘗試不加join()的話輸出是什么樣的哦~
1.3.2 setDaemon
- setDaemon() 與 join() 基本上是相對(duì)的 , join會(huì)等子線程執(zhí)行完畢 ; 而setDaemon則不會(huì)等,主線程結(jié)束,對(duì)應(yīng)的設(shè)置了守護(hù)線程的子線程也會(huì)立馬被殺死。
# -*- coding: utf-8 -*- import threading import time def run(name): print('I am %s' % name) time.sleep(2) print('子線程結(jié)束......') t1 = threading.Thread(target=run, args=('guhanzhe', )) # 設(shè)置守護(hù)線程 t1.setDaemon(True) t1.start() print('主線程結(jié)束......')
到此這篇關(guān)于Python threading和Thread模塊及線程的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python線程實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于騰訊云服務(wù)器部署微信小程序后臺(tái)服務(wù)(Python+Django)
這篇文章主要介紹了基于騰訊云服務(wù)器部署微信小程序后臺(tái)服務(wù)(Python+Django),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05python實(shí)現(xiàn)K折交叉驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)K折交叉驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04pyinstaller 3.6版本通過(guò)pip安裝失敗的解決辦法(推薦)
這篇文章主要介紹了pyinstaller 3.6版本通過(guò)pip安裝失敗的解決辦法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01使用Py2Exe for Python3創(chuàng)建自己的exe程序示例
今天小編就為大家分享一篇使用Py2Exe for Python3創(chuàng)建自己的exe程序示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Python實(shí)現(xiàn)目錄自動(dòng)清洗
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)目錄自動(dòng)清洗的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11Python實(shí)現(xiàn)手繪圖效果實(shí)例分享
在本篇文章里小編給大家整理了關(guān)于Python實(shí)現(xiàn)手繪圖效果,有需要的朋友們可以學(xué)習(xí)下。2020-07-07