併發編程
今天開始進入第二篇。今天的內容會比較基礎,主要是爲了讓新手也能無障礙地閱讀,因此仍是要再鞏固下基礎。學完了基礎,大家也就能很順暢地跟着個人思路理解之後的文章。編程
學會使用函數建立多線程多線程
學會使用類建立多線程併發
多線程:必學函數講解ide
通過總結,Python建立多線程主要有以下兩種方法:函數
函數學習
類spa
接下來,咱們就來揭開多線程的神祕面紗。線程
在Python3中,Python提供了一個內置模塊 threading.Thread
,能夠很方便地讓咱們建立多線程。code
threading.Thread()
通常接收兩個參數:blog
線程函數名:要放置線程讓其後臺執行的函數,由咱們自已定義,注意不要加()
;
線程函數的參數:線程函數名所需的參數,以元組的形式傳入。若不須要參數,能夠不指定。
舉個例子
1import time
2from threading import Thread
3
4# 自定義線程函數。
5def main(name="Python"):
6 for i in range(2):
7 print("hello", name)
8 time.sleep(1)
9
10# 建立線程01,不指定參數
11thread_01 = Thread(target=main)
12# 啓動線程01
13thread_01.start()
14
15
16# 建立線程02,指定參數,注意逗號
17thread_02 = Thread(target=main, args=("MING",))
18# 啓動線程02
19thread_02.start()
能夠看到輸出
1hello Python
2hello MING
3hello Python
4hello MING
是否是超級簡單呢?別急,下面也是同樣簡單。
相比較函數而言,使用類建立線程,會比較麻煩一點。
首先,咱們要自定義一個類,對於這個類有兩點要求,
必須繼承 threading.Thread
這個父類;
必須覆寫 run
方法。
這裏的 run
方法,和咱們上面線程函數
的性質是同樣的,能夠寫咱們的業務邏輯程序。在 start()
後將會調用。
來看一下例子
爲了方便對比,run
函數我複用上面的main
。
1import time
2from threading import Thread
3
4class MyThread(Thread):
5 def __init__(self, name="Python"):
6 # 注意,super().__init__() 必定要寫
7 # 並且要寫在最前面,不然會報錯。
8 super().__init__()
9 self.name=name
10
11 def run(self):
12 for i in range(2):
13 print("hello", self.name)
14 time.sleep(1)
15
16if __name__ == '__main__':
17 # 建立線程01,不指定參數
18 thread_01 = MyThread()
19 # 建立線程02,指定參數
20 thread_02 = MyThread("MING")
21
22 thread_01.start()
23 thread_02.start()
固然結果也是同樣的。
1hello Python
2hello MING
3hello Python
4hello MING
學完了兩種建立線程的方式,你必定會驚歎,咋麼這麼簡單,一點難度都沒有。
其實否則,上面咱們的線程函數
爲了方便理解,都使用的最簡單的代碼邏輯。而在實際使用當中,多線程運行期間,還會出現諸多問題,只是咱們如今還沒體會到它的複雜而已。
不過,你也沒必要擔憂,在後面的章節中,我會帶着你們一塊兒來探討一下,都有哪些難題,應該如何解決。
磨刀不誤吹柴工,咱們首先得來認識一下,Python給咱們提供的Thread
都有哪些函數和屬性,實現哪些功能。學習完這些,在後期的學習中,咱們才能更加得以應手。
通過個人總結,大約經常使用的方法有以下這些:
1t=Thread(target=func)
2
3# 啓動子線程
4t.start()
5
6# 阻塞子線程,待子線程結束後,再往下執行
7t.join()
8
9# 判斷線程是否在執行狀態,在執行返回True,不然返回False
10t.is_alive()
11t.isAlive()
12
13# 設置線程是否隨主線程退出而退出,默認爲False
14t.daemon = True
15t.daemon = False
16
17# 設置線程名
18t.name = "My-Thread"
好了,Python線程基礎知識,咱們大概都介紹完了。