新聞中心
Python 提供了 _thread 和 threading 兩個(gè)模塊來(lái)支持多線程,其中 _thread 提供低級(jí)別的、原始的線程支持,以及一個(gè)簡(jiǎn)單的鎖,正如它的名字所暗示的,一般編程不建議使用 thread 模塊;而 threading 模塊則提供了功能豐富的多線程支持。

Python 主要通過(guò)兩種方式來(lái)創(chuàng)建線程:
使用 threading 模塊的 Thread 類的構(gòu)造器創(chuàng)建線程。
繼承 threading 模塊的 Thread 類創(chuàng)建線程類。
調(diào)用 Thread 類的構(gòu)造器創(chuàng)建線程
調(diào)用 Thread 類的構(gòu)造器創(chuàng)建線程很簡(jiǎn)單,直接調(diào)用 threading.Thread 類的如下構(gòu)造器創(chuàng)建線程:
__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *,daemon=None)
上面的構(gòu)造器涉及如下幾個(gè)參數(shù):
group:指定該線程所屬的線程組。目前該參數(shù)還未實(shí)現(xiàn),因此它只能設(shè)為 None。
target:指定該線程要調(diào)度的目標(biāo)方法。
args:指定一個(gè)元組,以位置參數(shù)的形式為 target 指定的函數(shù)傳入?yún)?shù)。元組的第一個(gè)元素傳給 target 函數(shù)的第一個(gè)參數(shù),元組的第二個(gè)元素傳給 target 函數(shù)的第二個(gè)參數(shù)……依此類推。
kwargs:指定一個(gè)字典,以關(guān)鍵字參數(shù)的形式為 target 指定的函數(shù)傳入?yún)?shù)。
daemon:指定所構(gòu)建的線程是否為后代線程。
通過(guò) Thread 類的構(gòu)造器創(chuàng)建井啟動(dòng)多線程的步驟如下:
調(diào)用 Thread 類的構(gòu)造器創(chuàng)建線程對(duì)象。在創(chuàng)建線程對(duì)象時(shí),target 參數(shù)指定的函數(shù)將作為線程執(zhí)行體。
調(diào)用線程對(duì)象的 start() 方法啟動(dòng)該線程。
下面程序示范了通過(guò) Thread 類的構(gòu)造器來(lái)創(chuàng)建線程對(duì)象:
import threading
# 定義一個(gè)普通的action函數(shù),該函數(shù)準(zhǔn)備作為線程執(zhí)行體
def action(max):
for i in range(max):
# 調(diào)用threading模塊current_thread()函數(shù)獲取當(dāng)前線程
# 線程對(duì)象的getName()方法獲取當(dāng)前線程的名字
print(threading.current_thread().getName() + " " + str(i))
# 下面是主程序(也就是主線程的執(zhí)行體)
for i in range(100):
# 調(diào)用threading模塊current_thread()函數(shù)獲取當(dāng)前線程
print(threading.current_thread().getName() + " " + str(i))
if i == 20:
# 創(chuàng)建并啟動(dòng)第一個(gè)線程
t1 =threading.Thread(target=action,args=(100,))
t1.start()
# 創(chuàng)建并啟動(dòng)第二個(gè)線程
t2 =threading.Thread(target=action,args=(100,))
t2.start()
print('主線程執(zhí)行完成!')上面程序中的主程序包含一個(gè)循環(huán),當(dāng)循環(huán)變量 i 等于 20 時(shí)創(chuàng)建并啟動(dòng)兩個(gè)新線程:
創(chuàng)建了一個(gè) Thread 對(duì)象,該線程的 target 為 action,這意味著它會(huì)將 action 函數(shù)作為線程執(zhí)行體。接下來(lái)程序調(diào)用 start() 方法來(lái)啟動(dòng)t1線程。
再次創(chuàng)建了一個(gè)線程,其創(chuàng)建和啟動(dòng)方式與第一個(gè)線程完全相同。
運(yùn)行上面程序,將會(huì)看到如圖所示的界面。
雖然上面程序只顯式創(chuàng)建并啟動(dòng)了兩個(gè)線程,但實(shí)際上程序有三個(gè)線程,即程序顯式創(chuàng)建的兩個(gè)子線程和主線程。前面己經(jīng)提到,當(dāng) Python 程序開始運(yùn)行后,程序至少會(huì)創(chuàng)建一個(gè)主線程,主線程的線程執(zhí)行體就是程序中的主程序(沒(méi)有放在任何函數(shù)中的代碼)。
從上圖可以看出,此時(shí)程序中共包含三個(gè)線程,這三個(gè)線程的執(zhí)行沒(méi)有先后順序,它們以并發(fā)方式執(zhí)行:Thread-1 執(zhí)行一段時(shí)間,然后可能 Thread-2 或 MainThread 獲得 CPU 執(zhí)行一段時(shí)間,接下來(lái)又換其他線程執(zhí)行,這就是典型的線程并發(fā)執(zhí)行,CPU 以快速輪換的方式在多個(gè)線程之間切換,從而給用戶一種錯(cuò)覺(jué),即多個(gè)線程似乎同時(shí)在執(zhí)行。
通過(guò)上面介紹不難看出多線程的意義,如果不使用多線程,主程序直接調(diào)用兩次 action() 函數(shù),那么程序必須等第一次調(diào)用的 action() 函數(shù)執(zhí)行完成,才會(huì)執(zhí)行第二次調(diào)用的 action() 函數(shù);必須等第二次調(diào)用的 action() 函數(shù)執(zhí)行完成,才會(huì)繼續(xù)向下執(zhí)行主程序。
標(biāo)題名稱:創(chuàng)新互聯(lián)Python教程:Python創(chuàng)建線程
文章路徑:http://fisionsoft.com.cn/article/dhseoih.html


咨詢
建站咨詢
