python利用執行緒實現多工
我們怎麼讓一個 Python 程式裡邊實現多工呢?
實現多工可以有多種方式,這裡我們先了解使用執行緒的方式實現多工。
執行緒是實現多工的一種的手段。
其實用的是 threading 模組,threading 模組裡有一個類叫 Thread。
Python 的 thread 模組是比較底層的模組,Python 的 threading 模組是對 thread 做了一些包裝的,可以更加方便的被使用。
一、通過構造器傳函式的方式建立執行緒
我們先來看一個例項:
import time import threading def saySorry(): print("親愛的,我錯了,我能吃飯了麼?") time.sleep(1) if __name__ == "__main__": for i in range(5): t = threading.Thread(target=saySorry) # 啟動執行緒,即讓執行緒開始執行 t.start()
執行結果:
threading.Thread 建立了一個物件,但是不會建立執行緒。
當呼叫 Thread 創建出來的例項物件 t.start() 執行的時候,才會建立執行緒,並且讓這個執行緒開始執行。
一個程式執行起來之後,一定有一個執行程式碼的東西。這個東西就稱之為執行緒。
一個程式執行的時候,有一個主執行緒,當 t.start() 執行的時候,就會建立一個子執行緒,子執行緒可以單獨去執行,這就實現了多工的執行。
二、檢視程式中的執行緒數量
如果想知道程式中執行緒的數量,可以呼叫 threading 中的 enumerate(),它返回了一個當前程式中執行的執行緒的列表,包括主執行緒自己。
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' % length) if length <= 1: break sleep(0.5)
執行結果:
為了看清楚 enumerate() 究竟是什麼,我們修改下程式碼列印 enumerate(),更能看清楚執行緒的數量和狀態。
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)
執行結果:
三、通過繼承 Thread 的方式建立執行緒
經過我們之前的學習,能夠看出,通過使用 threading 模組能完成多工的程式開發。
但是為了讓每個執行緒的封裝性更完美,所以使用 threading 模組時,往往會定義一個新的子類 class。
子類只要繼承 threading.Thread 就可以了,然後重寫 run 方法。
所以說,Python 主要通過兩種方式來建立執行緒:
- 使用 threading 模組中 Thread 類的構造器建立執行緒。即直接對類 threading.Thread 進行例項化建立執行緒,並呼叫例項化物件的 start() 方法啟動執行緒。
- 繼承 threading 模組中的 Thread 類建立執行緒類。即用 threading.Thread 派生出一個新的子類,將新建類例項化建立執行緒,並呼叫其 start() 方法啟動執行緒。
執行結果:
I'm Thread-1 @ 0
I'm Thread-1 @ 1
I'm Thread-1 @ 2
Python 的 threading.Thread 類有一個 run 方法,用於定義執行緒的功能函式,可以在自己的執行緒類中覆蓋該方法。
而建立自己的執行緒例項後,通過 Thread 類的 start 方法,可以啟動該執行緒,交給 Python 虛擬機器進行排程,當該執行緒獲得執行的機會時,就會呼叫 run 方法執行執行緒。
通過繼承的方式來實現執行緒一般應用於,這個執行緒的邏輯比較複雜,並且分成了幾個方法或函式。
以上就是python利用執行緒實現多工的詳細內容,更多關於python 執行緒實現多工的資料請關注我們其它相關文章!