[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

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

下回揭曉









119會員
201內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
想要開始Python語言的開發環境,有兩種常見方式,一種是下載安裝到本機端,另一種是直接在雲端執行。本文將介紹三個常見的開發工具及其安裝步驟。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
PyInstaller 是一個強大的工具,可以將 Python 程式碼打包成獨立的可執行檔案,讓你的程式可以在沒有 Python 解釋器的情況下運行。這對於分享和分發你的 Python 應用程式非常有用。以下是使用 PyInstaller 的基本步驟:
使用Python的Threading模組設計一個能夠在背景待命的程式,並在等待5秒後自動結束。我們將使用執行緒來執行背景任務,並使用定時等待來控制程式的結束時間。這種方法適用於不依賴於特定按鍵事件的情況,而是在固定的時間後自動退出程式。
Thumbnail
本篇將帶你學習 Python 的基本語法和資料型態。我們將從變數和資料型態開始,包括整數、浮點數、字串和布林值。接著,我們將探討輸入和輸出的方法,讓你能夠與使用者進行互動。最後,我們會介紹基本運算符和運算子,以進行數值計算。通過這些學習筆記,你將輕鬆掌握 Python 的基礎知識,讓我們開始吧!
Thumbnail
我們可以利用工作表的append()方法,在工作表的列尾添加資料列。 利用迴圈的技巧,我們可以批次賦予區塊內所有儲存格相同的值。 我們也可以在指定的列(行)之前插入指定數量的空白列(行),從指定的列(行)開始向下(右)刪除指定數量的列(行)。
Thumbnail
前言: 今天要講用python來做使用者介面,由於姆姆平常的工作面對是工廠產線生產,所以一般來說交付程式的時候會給(sample.py)或是(sample.pyc)這類的檔案格式,其中py和pyc檔簡單說,差別在一個看的到(py)原始碼一個看不到(pyc)。 TCL: 官方下載網址: PAGE:
Thumbnail
第一個實戰,我們就先從如何連接自己的網站開始,當我們輸入「部落格」時,機器人就會輸出一個表格,只要點選「馬上觀看」,我們就可以直接連接到自己的部落格,此功能其實也可以運用在連接粉專或是其他想要觀看的網站唷!! Flex Message 實際製作教學 選擇模板 更改圖片 修改內容物 修改底部box
Thumbnail
一、什麼是變數?   變數是指用來代表某一種資料型態的符號,以非數字的符號來表達,可以是英文字母也可以是一個英文單字,不過python有一些英文字母不能被當作變數,我們稱作保留字,例如:False、None、True、and、is、not、or、......,之後會在介紹。
運算子= 用法:  物件=運算式 舉例:  x=1+1 說明:  先計算右側,並將左側物件(x)建立連結到右側結果所代表的物件(2)。 變數與= 當變數透過=與某物件做連結時,呼叫此變數實際上會是呼叫該物件,變數僅是做一個參考(reference)。 舉例: a=1+2 //右側計算結果為3,所
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
想要開始Python語言的開發環境,有兩種常見方式,一種是下載安裝到本機端,另一種是直接在雲端執行。本文將介紹三個常見的開發工具及其安裝步驟。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
PyInstaller 是一個強大的工具,可以將 Python 程式碼打包成獨立的可執行檔案,讓你的程式可以在沒有 Python 解釋器的情況下運行。這對於分享和分發你的 Python 應用程式非常有用。以下是使用 PyInstaller 的基本步驟:
使用Python的Threading模組設計一個能夠在背景待命的程式,並在等待5秒後自動結束。我們將使用執行緒來執行背景任務,並使用定時等待來控制程式的結束時間。這種方法適用於不依賴於特定按鍵事件的情況,而是在固定的時間後自動退出程式。
Thumbnail
本篇將帶你學習 Python 的基本語法和資料型態。我們將從變數和資料型態開始,包括整數、浮點數、字串和布林值。接著,我們將探討輸入和輸出的方法,讓你能夠與使用者進行互動。最後,我們會介紹基本運算符和運算子,以進行數值計算。通過這些學習筆記,你將輕鬆掌握 Python 的基礎知識,讓我們開始吧!
Thumbnail
我們可以利用工作表的append()方法,在工作表的列尾添加資料列。 利用迴圈的技巧,我們可以批次賦予區塊內所有儲存格相同的值。 我們也可以在指定的列(行)之前插入指定數量的空白列(行),從指定的列(行)開始向下(右)刪除指定數量的列(行)。
Thumbnail
前言: 今天要講用python來做使用者介面,由於姆姆平常的工作面對是工廠產線生產,所以一般來說交付程式的時候會給(sample.py)或是(sample.pyc)這類的檔案格式,其中py和pyc檔簡單說,差別在一個看的到(py)原始碼一個看不到(pyc)。 TCL: 官方下載網址: PAGE:
Thumbnail
第一個實戰,我們就先從如何連接自己的網站開始,當我們輸入「部落格」時,機器人就會輸出一個表格,只要點選「馬上觀看」,我們就可以直接連接到自己的部落格,此功能其實也可以運用在連接粉專或是其他想要觀看的網站唷!! Flex Message 實際製作教學 選擇模板 更改圖片 修改內容物 修改底部box
Thumbnail
一、什麼是變數?   變數是指用來代表某一種資料型態的符號,以非數字的符號來表達,可以是英文字母也可以是一個英文單字,不過python有一些英文字母不能被當作變數,我們稱作保留字,例如:False、None、True、and、is、not、or、......,之後會在介紹。
運算子= 用法:  物件=運算式 舉例:  x=1+1 說明:  先計算右側,並將左側物件(x)建立連結到右側結果所代表的物件(2)。 變數與= 當變數透過=與某物件做連結時,呼叫此變數實際上會是呼叫該物件,變數僅是做一個參考(reference)。 舉例: a=1+2 //右側計算結果為3,所