python利用線程實(shí)現(xiàn)多任務(wù)
我們?cè)趺醋屢粋€(gè) Python 程序里邊實(shí)現(xiàn)多任務(wù)呢?
實(shí)現(xiàn)多任務(wù)可以有多種方式,這里我們先了解使用線程的方式實(shí)現(xiàn)多任務(wù)。
線程是實(shí)現(xiàn)多任務(wù)的一種的手段。
其實(shí)用的是 threading 模塊,threading 模塊里有一個(gè)類(lèi)叫 Thread。
Python 的 thread 模塊是比較底層的模塊,Python 的 threading 模塊是對(duì) thread 做了一些包裝的,可以更加方便的被使用。
一、通過(guò)構(gòu)造器傳函數(shù)的方式創(chuàng)建線程
我們先來(lái)看一個(gè)實(shí)例:
import time
import threading
def saySorry():
print("親愛(ài)的,我錯(cuò)了,我能吃飯了么?")
time.sleep(1)
if __name__ == "__main__":
for i in range(5):
t = threading.Thread(target=saySorry)
# 啟動(dòng)線程,即讓線程開(kāi)始執(zhí)行
t.start()
運(yùn)行結(jié)果:

threading.Thread 創(chuàng)建了一個(gè)對(duì)象,但是不會(huì)創(chuàng)建線程。
當(dāng)調(diào)用 Thread 創(chuàng)建出來(lái)的實(shí)例對(duì)象 t.start() 執(zhí)行的時(shí)候,才會(huì)創(chuàng)建線程,并且讓這個(gè)線程開(kāi)始運(yùn)行。
一個(gè)程序運(yùn)行起來(lái)之后,一定有一個(gè)執(zhí)行代碼的東西。這個(gè)東西就稱之為線程。
一個(gè)程序運(yùn)行的時(shí)候,有一個(gè)主線程,當(dāng) t.start() 執(zhí)行的時(shí)候,就會(huì)創(chuàng)建一個(gè)子線程,子線程可以單獨(dú)去執(zhí)行,這就實(shí)現(xiàn)了多任務(wù)的運(yùn)行。
二、查看程序中的線程數(shù)量
如果想知道程序中線程的數(shù)量,可以調(diào)用 threading 中的 enumerate(),它返回了一個(gè)當(dāng)前程序中運(yùn)行的線程的列表,包括主線程自己。
import threading
from time import sleep
def 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__':
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
while True:
length = len(threading.enumerate())
print('當(dāng)前運(yùn)行的線程數(shù)為:%d' % length)
if length <= 1:
break
sleep(0.5)
運(yùn)行結(jié)果:

為了看清楚 enumerate() 究竟是什么,我們修改下代碼打印 enumerate(),更能看清楚線程的數(shù)量和狀態(tài)。
import threading
from time import sleep
def sing():
for i in range(5):
print("正在唱歌...%d" % i)
sleep(1)
def dance():
for i in range(3):
print("正在跳舞...%d" % i)
sleep(1)
if __name__ == '__main__':
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
while True:
print(threading.enumerate())
if len(threading.enumerate()) <= 1:
break
sleep(0.5)
運(yùn)行結(jié)果:

三、通過(guò)繼承 Thread 的方式創(chuàng)建線程
經(jīng)過(guò)我們之前的學(xué)習(xí),能夠看出,通過(guò)使用 threading 模塊能完成多任務(wù)的程序開(kāi)發(fā)。
但是為了讓每個(gè)線程的封裝性更完美,所以使用 threading 模塊時(shí),往往會(huì)定義一個(gè)新的子類(lèi) class。
子類(lèi)只要繼承 threading.Thread 就可以了,然后重寫(xiě) run 方法。
所以說(shuō),Python 主要通過(guò)兩種方式來(lái)創(chuàng)建線程:
- 使用 threading 模塊中 Thread 類(lèi)的構(gòu)造器創(chuàng)建線程。即直接對(duì)類(lèi) threading.Thread 進(jìn)行實(shí)例化創(chuàng)建線程,并調(diào)用實(shí)例化對(duì)象的 start() 方法啟動(dòng)線程。
- 繼承 threading 模塊中的 Thread 類(lèi)創(chuàng)建線程類(lèi)。即用 threading.Thread 派生出一個(gè)新的子類(lèi),將新建類(lèi)實(shí)例化創(chuàng)建線程,并調(diào)用其 start() 方法啟動(dòng)線程。
運(yùn)行結(jié)果:
I'm Thread-1 @ 0
I'm Thread-1 @ 1
I'm Thread-1 @ 2
Python 的 threading.Thread 類(lèi)有一個(gè) run 方法,用于定義線程的功能函數(shù),可以在自己的線程類(lèi)中覆蓋該方法。
而創(chuàng)建自己的線程實(shí)例后,通過(guò) Thread 類(lèi)的 start 方法,可以啟動(dòng)該線程,交給 Python 虛擬機(jī)進(jìn)行調(diào)度,當(dāng)該線程獲得執(zhí)行的機(jī)會(huì)時(shí),就會(huì)調(diào)用 run 方法執(zhí)行線程。
通過(guò)繼承的方式來(lái)實(shí)現(xiàn)線程一般應(yīng)用于,這個(gè)線程的邏輯比較復(fù)雜,并且分成了幾個(gè)方法或函數(shù)。
以上就是python利用線程實(shí)現(xiàn)多任務(wù)的詳細(xì)內(nèi)容,更多關(guān)于python 線程實(shí)現(xiàn)多任務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python-opencv實(shí)現(xiàn)視頻指定幀數(shù)間隔圖像的保存功能
這篇文章主要介紹了python-opencv實(shí)現(xiàn)視頻指定幀數(shù)間隔圖像的保存的方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
一文帶你理解Python中面向?qū)ο缶幊蘋(píng)OP的概念
在Python中,面向?qū)ο缶幊蹋∣OP)是一種在編程中使用對(duì)象和類(lèi)的編程范式,它旨在實(shí)現(xiàn)現(xiàn)實(shí)世界的實(shí)體,下面我們就一起來(lái)看看它的相關(guān)知識(shí)吧2023-08-08
python安裝讀取grib庫(kù)總結(jié)(推薦)
這篇文章主要介紹了python安裝讀取grib庫(kù)總結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
靈活運(yùn)用Python 枚舉類(lèi)來(lái)實(shí)現(xiàn)設(shè)計(jì)狀態(tài)碼信息
在python中枚舉是一種類(lèi)(Enum,IntEnum),存放在enum模塊中。枚舉類(lèi)型可以給一組標(biāo)簽賦予一組特定的值,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Python基礎(chǔ)教程之while循環(huán)用法講解
Python中除了for循環(huán)之外還有一個(gè)while循環(huán),下面這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之while循環(huán)用法講解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
Python利用socket模塊開(kāi)發(fā)簡(jiǎn)單的端口掃描工具的實(shí)現(xiàn)
這篇文章主要介紹了Python利用socket模塊開(kāi)發(fā)簡(jiǎn)單的端口掃描工具的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

