1. 程式人生 > 程式設計 >python利用執行緒實現多工

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()

執行結果:

python利用執行緒實現多工

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)

執行結果:

python利用執行緒實現多工

為了看清楚 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)

執行結果:

python利用執行緒實現多工

三、通過繼承 Thread 的方式建立執行緒

經過我們之前的學習,能夠看出,通過使用 threading 模組能完成多工的程式開發。

但是為了讓每個執行緒的封裝性更完美,所以使用 threading 模組時,往往會定義一個新的子類 class。

子類只要繼承 threading.Thread 就可以了,然後重寫 run 方法。

所以說,Python 主要通過兩種方式來建立執行緒:

  1. 使用 threading 模組中 Thread 類的構造器建立執行緒。即直接對類 threading.Thread 進行例項化建立執行緒,並呼叫例項化物件的 start() 方法啟動執行緒。
  2. 繼承 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 執行緒實現多工的資料請關注我們其它相關文章!