我們怎么讓一個 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() 方法啟動執行緒,
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 方法執行執行緒,
通過繼承的方式來實作執行緒一般應用于,這個執行緒的邏輯比較復雜,并且分成了幾個方法或函式,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64345.html
標籤:Python
上一篇:Java 15 正式發布, 14 個新特性,重繪你的認知!!
下一篇:boost xml決議
