[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
135會員
223內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言1
avatar-img
留言分享你的想法!
螃蟹_crab-avatar-img
發文者
2024/03/22
[Python][微進階]queue佇列中的資料被多個執行緒並行處理提及了這篇文章,趕快過去看看吧!
螃蟹_crab的沙龍 的其他內容
在這篇文章中,我們講述瞭如何使用numpy.where方法查找Numpy數組中值的索引。除了介紹了numpy.where的基本用法外,還舉了一些應用實例進行了詳細說明。文章最後提供了其他應用領域以及相關參考文獻。
f字符串(f-string)在Python 3.6版本引入了新特性,可以更方便地格式化字符串。本文介紹了f-string的基本使用方法,以及表達式、運算符、格式化控制、字典和列表的應用,以及調用方法和函數等。f-string提供了一種更靈活的方式,使你能夠控制字符串的外觀,以滿足不同情況下的需求。
NumPy 提供了一種 N 維數組類型 ndarray(N-dimensional array) ,它描述了相同類型的「數據類型」的集合。 多維數組: ndarray 是一個 N 維數組,其中 N 可以是任意整數。一維數組是向量,二維數組是矩陣
NumPy在圖像處理、機器學習、數學和統計學等領域中被廣泛應用。 以下是一些常見的應用場景: 數據處理和分析: NumPy提供了高效的多維數組(nd array)和相應的操作函數,使得對大型數據集進行快速、有效的操作變得容易。
在程式開發中,協作合作專案時,利用type hint,可以快速知道函式輸入及輸出的資料型別,在後續的維護時也會更加方便及可讀。 Type hints 是Python 3.5 版本引入的功能,它允許在函數宣告中指定參數和傳回值的類型。Type hints 是一種可選的註解形式,不會影響程式碼的運行,
在現實生活中,充滿的警報及安全措施,總會設個安全線在那,若觸碰到底線時則會有警報響起。 在Python也有類似的作法,如果希望在某個條件達到時,就拉起警報不要讓程式繼續進行下去,就適合使用raise 這種機制讓開發者能夠在程序執行時檢測到不正確的條件,然後通過引發異常停止程序的執行或通知使用者。
在這篇文章中,我們講述瞭如何使用numpy.where方法查找Numpy數組中值的索引。除了介紹了numpy.where的基本用法外,還舉了一些應用實例進行了詳細說明。文章最後提供了其他應用領域以及相關參考文獻。
f字符串(f-string)在Python 3.6版本引入了新特性,可以更方便地格式化字符串。本文介紹了f-string的基本使用方法,以及表達式、運算符、格式化控制、字典和列表的應用,以及調用方法和函數等。f-string提供了一種更靈活的方式,使你能夠控制字符串的外觀,以滿足不同情況下的需求。
NumPy 提供了一種 N 維數組類型 ndarray(N-dimensional array) ,它描述了相同類型的「數據類型」的集合。 多維數組: ndarray 是一個 N 維數組,其中 N 可以是任意整數。一維數組是向量,二維數組是矩陣
NumPy在圖像處理、機器學習、數學和統計學等領域中被廣泛應用。 以下是一些常見的應用場景: 數據處理和分析: NumPy提供了高效的多維數組(nd array)和相應的操作函數,使得對大型數據集進行快速、有效的操作變得容易。
在程式開發中,協作合作專案時,利用type hint,可以快速知道函式輸入及輸出的資料型別,在後續的維護時也會更加方便及可讀。 Type hints 是Python 3.5 版本引入的功能,它允許在函數宣告中指定參數和傳回值的類型。Type hints 是一種可選的註解形式,不會影響程式碼的運行,
在現實生活中,充滿的警報及安全措施,總會設個安全線在那,若觸碰到底線時則會有警報響起。 在Python也有類似的作法,如果希望在某個條件達到時,就拉起警報不要讓程式繼續進行下去,就適合使用raise 這種機制讓開發者能夠在程序執行時檢測到不正確的條件,然後通過引發異常停止程序的執行或通知使用者。
你可能也想看
Google News 追蹤
Thumbnail
本教學將介紹如何使用 OpenCV 來檢測螺絲的鎖附間距,並提供完整的 Python 程式碼來實作這項功能。 🔹 1. 設計目標 使用二值化處理與形態學運算來強化影像 計算螺絲之間的間距 視覺化結果,標記最大間距並顯示數值 🔹 2. 測試用螺絲影像 🔹 3.
Thumbnail
本篇文章介紹 Python 的 asyncio 標準庫,說明其用於非同步編程的優勢,並深入探討 await, asyncio.create_task(), asyncio.gather() 的用法與差異,以提升 I/O 密集型應用的效能。
使用 ldap3 2.9.1 pip install ldap3​ python: from ldap3 import Server, Connection, SIMPLE, SYNC, ALL import pandas as p d import json # LDAP 伺服器地址
這一節要來看看,有許多個力同時作用時,該怎麼處理。
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
有時候在使用數學運算時,會出現一些看似反直覺的結果。 這些錯誤可能是由於我們對於數學規則的誤解或者忽略了一些細節所導致的。 以下是一些 Python 的例子: 除餘數 例如負數求餘數。 假設-15 % 90 狀況下 會下意思覺得結果還是 -15 但輸出的結果是 75。
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
本教學將介紹如何使用 OpenCV 來檢測螺絲的鎖附間距,並提供完整的 Python 程式碼來實作這項功能。 🔹 1. 設計目標 使用二值化處理與形態學運算來強化影像 計算螺絲之間的間距 視覺化結果,標記最大間距並顯示數值 🔹 2. 測試用螺絲影像 🔹 3.
Thumbnail
本篇文章介紹 Python 的 asyncio 標準庫,說明其用於非同步編程的優勢,並深入探討 await, asyncio.create_task(), asyncio.gather() 的用法與差異,以提升 I/O 密集型應用的效能。
使用 ldap3 2.9.1 pip install ldap3​ python: from ldap3 import Server, Connection, SIMPLE, SYNC, ALL import pandas as p d import json # LDAP 伺服器地址
這一節要來看看,有許多個力同時作用時,該怎麼處理。
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
有時候在使用數學運算時,會出現一些看似反直覺的結果。 這些錯誤可能是由於我們對於數學規則的誤解或者忽略了一些細節所導致的。 以下是一些 Python 的例子: 除餘數 例如負數求餘數。 假設-15 % 90 狀況下 會下意思覺得結果還是 -15 但輸出的結果是 75。
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)