什麼是線程
對於處理多個任務,計算機一般有兩種處理方法:一種是可以再一個應用程序內使用多個進程,每個進程負責一部分工作;另一種是使用一個進程內的多個線程。
線程(Thread)是操作系統能夠進行運算調度的最小電源。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程可以控制多個線程。比如視頻播放器,顯示畫面用一個線程,播放聲音是一個線程。只有兩個線程同時工作,我們纔可以正常觀看畫面和聲音同步的視頻
創建線程
線程是操作系統直接支持的執行單元,故大多高級語言都內置了對線程的支持。
Python的標準庫提供了兩個模塊:_thread和threading來對線程進行操作。其中_thread是低級模塊,threading是高級模塊,對_thread進行了封裝。所以絕大部分情況下我們都只需要用threading這個模塊
threading模塊提供了一個Thread類來代表一個線程對象,Thread類語法如下:
Thread([group ,target ,name, args, kwargs)
group:線程組,值爲None,如何使用後面會介紹
target:表示一個可用對象,線程啓動的時候,run()方法將會調用次對象,默認值爲None,表示不調用任何內容
name:表示當前線程的名稱,默認爲“Thread-N”
args:表示傳遞給target()函數的參數元組
kwargs:表示傳遞給target()的參數字典
Thread類的方法和創建進程用的 Process類方法十分類似
#使用threading模塊創建線程
import threading,time
def process():
for i in range(3):
time.sleep(1)//推遲調用線程的運行1s
print("thread name is %s" % threading.current_thread().name)
if __name__ == '__main__':
print("--------主線程開始----------")
threads = [threading.Thread(target=process) for i in range(4)] #創建四個線程存入列表
for t in threads:
t.start()
for t in threads:
t.join()
print("----主線程結束-----")
代碼解析
上述代碼中創建了4個線程,然後分別用for循環執行了run()方法和start()方法
Tip:通過執行結果可以看出,線程的執行順序實際上的不確定的
通過繼承Thread類創建線程
繼承Thread線程類和繼承Process進程類的方法十分類似,也可以通過定義一個子類,使其繼承Thread類來創建進程
下面創建一個子類SubThread繼承Thread類,並且定義一個run()方法。實例化SubThread類創建兩個線程,並且調用start()方法開啓線程,程序會自動調用run()方法。代碼如下
#-*- coding: utf-8 -*-
import threading
import time
class SubThread(threading.Thread):
def run(self):
for i in range(3):
time.sleep(1)
msg = "子線程" + self.name + "執行,i=" + str(i)
print(msg)
if __name__ == '__main__':
print("主線程開始")
t1 = SubThread()
t2 = SubThread()
t1.start()
t2.start()
t1.join()
t2.join()
print("主線程結束")
運行結果如下
E:\Python\python.exe E:/PythonCode/PythonStudy/Chapter16/InheritThreadClass.py
主線程開始
子線程Thread-2執行,i=0
子線程Thread-1執行,i=0
子線程Thread-2執行,i=1
子線程Thread-1執行,i=1
子線程Thread-1執行,i=2子線程Thread-2執行,i=2
主線程結束
Process finished with exit code 0