我們怎麼讓乙個 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)
執行結果:
經過我們之前的學習,能夠看出,通過使用 threading 模組能完成多工的程式開發。
但是為了讓每個執行緒的封裝性更完美,所以使用 threading 模組時,往往會定義乙個新的子類 class。
子類只要繼承 threading.thread 就可以了,然後重寫 run 方法。
所以說,python 主要通過兩種方式來建立執行緒:
使用 threading 模組中 thread 類的構造器建立執行緒。即直接對類 threading.thread 進行例項化建立執行緒,並呼叫例項化物件的 start() 方法啟動執行緒。
繼承 threading 模組中的 thread 類建立執行緒類。即用 threading.thread 派生出乙個新的子類,將新建類例項化建立執行緒,並呼叫其 start() 方法啟動執行緒。
import threading
import time
class mythread(threading.thread):
def run(self):
for i in range(3):
time.sleep(1)
# name屬性中儲存的是當前執行緒的名字
msg = "i'm "+self.name+' @ '+str(i)
print(msg)
if __name__ == '__main__':
t = mythread()
t.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多工 執行緒
併發 指的是任務數多餘cpu核數,通過作業系統的各種任務排程演算法,實現用多個任務 一起 執行 實際上總有一些任務不在執行,因為切換任務的速度相當快,看上去一起執行而已 並行 指的是任務數小於等於cpu核數,即任務真的是一起執行的 執行緒python的thread模組是比較底層的模組,python的...
python 多工 執行緒(一)
python提供了兩個模組來實現多執行緒thread和threading 推薦 thread模組提供了基本的執行緒和鎖支援,threading提供的是更高階的完全的執行緒管理,且更方便操作。在 python3 中不能再使用 thread 模組。為了相容性,python3 將 thread 重新命名為...
Python 多工 執行緒同步
高階程式設計技巧 學習筆記 1.1 實現兩個執行緒一問一答 class xiaoai threading.thread def init self super init name 小艾同學 def run self print f 在 print f 你猜現在幾點了?class tianmao th...