執行緒,Python 實現多工的方式之一

2022-09-03 15:54:14 字數 3424 閱讀 6156

我們怎麼讓乙個 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...