[Python][微進階]threading 多執行緒平行處理

更新於 發佈於 閱讀時間約 6 分鐘

當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。

threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果


同步模式:每個任務按照順序執行,後面的任務必須等待前面的任務執行完成

非同步模式:各自執行各自的任務

這裡的同步概念,並非為同步做很多事情,而是有點排隊的概念,同一個步序上。

非同步則就是不同步序,而可以同時做很多事情。

同步與非同步差異

同步與非同步差異

以下用程示範例實現說明

同步處理

在此程式範例中,程式是由上往下開始執行,plan_A跑完才會再跑plan_B。

def plan_A():
for i in range(3):
print(f'plan_A執行: {i} 次')
time.sleep(0.5)

def plan_B():
for i in range(3):
print(f'plan_B執行: {i} 次')
time.sleep(0.5)

plan_A()
plan_B()

輸出結果

plan_A執行: 0
plan_A執行: 1
plan_A執行: 2
plan_B執行: 0
plan_B執行: 1
plan_B執行: 2

非同步處理

由輸出結果來看,同時間一起執行了plan_A與plan_B這兩個函式。

import threading
import time

def plan_A():
for i in range(3):
print(f'plan_A執行: {i} 次')
time.sleep(0.5)

def plan_B():
for i in range(3):
print(f'plan_B執行: {i} 次')
time.sleep(0.5)

# 建立新的執行緒
plan_A_thread = threading.Thread(target = plan_A)
plan_B_thread = threading.Thread(target = plan_B)

# 執行執行緒
plan_A_thread.start()
plan_B_thread.start()

輸出結果

plan_A執行: 0
plan_B執行: 0
plan_A執行: 1
plan_B執行: 1
plan_B執行: 2
plan_A執行: 2

threading 模組的基本用法及相關說明:

創建執行緒: 使用 Thread 類可以創建一個新的執行緒。你可以將要執行的函式或方法傳遞給 Thread 類的構造函數。例如:

import threading

def my_function():
# 執行你的任務
pass

thread = threading.Thread(target=my_function)

啟動執行緒

使用 start() 方法來啟動一個執行緒。一旦執行緒啟動,它將執行其目標函式。

thread.start()

等待執行緒結束

使用 join() 方法來等待執行緒結束。這將使程序阻塞,直到線程完成其任務並結束。

thread.join()

等待執行緒結束範例

加入了join()等待執行緒,

import threading
import time

def plan_A():
for i in range(3):
print(f'plan_A執行: {i} 次')
time.sleep(0.5)

def plan_B():
for i in range(3):
print(f'plan_B執行: {i} 次')
time.sleep(0.5)

# 建立新的執行緒
plan_A_thread = threading.Thread(target = plan_A)
plan_B_thread = threading.Thread(target = plan_B)

# 執行plan_A執行緒
plan_A_thread.start()
# join()等待執行緒,直到該執行緒完成才會進行後續動作。
plan_A_thread.join()
# 執行plan_B執行緒
plan_B_thread.start()

輸出

plan_A執行: 0
plan_A執行: 1
plan_A執行: 2
plan_B執行: 0
plan_B執行: 1
plan_B執行: 2

避免同時間過多執行緒

Lock() 鎖定

多個執行緒共用同一個 Lock,一開始只會先執行第一個被鎖住的執行緒,等解鎖後才會執行後續的執行緒。

依這範例來解說Lock的用法,當plan_A執行時,迴圈跑到第三圈時就解開鎖,plan_B就會開始跑

import threading
import time

def plan_A():
lock.acquire()
for i in range(5):
print(f'plan_A執行: {i} 次')
time.sleep(0.5)
if i == 2:
lock.release()

def plan_B():
lock.acquire()
for i in range(5):
print(f'plan_B執行: {i} 次')
time.sleep(0.5)
lock.release()

# 建立 Lock
lock =threading.Lock()

# 建立新的執行緒
plan_A_thread = threading.Thread(target = plan_A)
plan_B_thread = threading.Thread(target = plan_B)

# 執行plan_A執行緒
plan_A_thread.start()
# 執行plan_B執行緒
plan_B_thread.start()

輸出

plan_A執行: 0
plan_A執行: 1
plan_A執行: 2
plan_A執行: 3
plan_B執行: 0
plan_A執行: 4
plan_B執行: 1
plan_B執行: 2
plan_B執行: 3
plan_B執行: 4

後續,在來寫更多或其他範例來實現多執行緒的方法

下回揭曉









留言
avatar-img
留言分享你的想法!
螃蟹_crab-avatar-img
發文者
2024/03/22
[Python][微進階]queue佇列中的資料被多個執行緒並行處理提及了這篇文章,趕快過去看看吧!
avatar-img
螃蟹_crab的沙龍
149會員
284內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
Thumbnail
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
Thumbnail
為什麼需要非同步? 我們在「【Web微知識系列】 Web Workers」有介紹到在瀏覽器可執行腳本Javascript環境底下如何完成非同步的操作, 主要是為了讓任務更有效率的進行, 不會因為一個非常耗時的工作堵塞住整個服務, 導致無法服務他人的窘境。 大家應該經常在餐廳裡會看到服務員協
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News