[Python教學] 進階:平行程式設計

[Python教學] 進階:平行程式設計

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

在這篇文章中,我們將深入探討 Python 中的平行程式設計,特別是使用 threading 和 multiprocessing 模組來實現多執行緒和多進程的應用。這些技術可以幫助我們充分利用現代 CPU 的多核心架構,提高程式的執行效率。

什麼是平行程式設計?

平行程式設計是一種同時執行多個計算任務的技術,常用於提升應用程式的效能。在 Python 中,主要有兩種方式來實現平行:多執行緒 (Multithreading) 和 多進程 (Multiprocessing)

  • 多執行緒:適合 I/O 密集型任務,例如網路請求或檔案讀寫。
  • 多進程:適合 CPU 密集型任務,例如數據處理或計算密集型工作。

使用 threading 模組

threading 模組是 Python 標準庫的一部分,提供了創建和管理執行緒的功能。

基本方式

以下是使用 threading 模組的基本範例:

import threading
import time

# 子執行緒的工作函數
def job(num):
print(f"Thread {num} starting")
time.sleep(2)
print(f"Thread {num} finished")

# 建立和啟動子執行緒
threads = []
for i in range(5):
t = threading.Thread(target=job, args=(i,))
threads.append(t)
t.start()

# 等待所有子執行緒結束
for t in threads:
t.join()

print("All threads finished.")

在這個範例中,我們定義了一個名為 job 的函數,然後創建了五個子執行緒,每個執行緒都會呼叫這個函數。使用 t.join() 確保主執行緒在所有子執行緒完成之前不會結束。

物件導向方式

我們也可以使用物件導向的方法來創建執行緒:

import threading
import time

class MyThread(threading.Thread):
def __init__(self, num):
super().__init__()
self.num = num

def run(self):
print(f"Thread {self.num} starting")
time.sleep(2)
print(f"Thread {self.num} finished")

threads = []
for i in range(5):
thread = MyThread(i)
threads.append(thread)
thread.start()

for thread in threads:
thread.join()

print("All threads finished.")

在這裡,我們創建了一個繼承自 threading.Thread 的類別,並重寫了 run 方法來定義每個執行緒的工作。


使用 multiprocessing 模組

multiprocessing 模組也屬於 Python 標準庫,它允許我們創建獨立的進程,每個進程都有自己的 Python 解釋器,這樣可以繞過 GIL(全局解釋器鎖)的限制。

基本方式

import multiprocessing
import time

def worker(num):
print(f"Process {num} starting")
time.sleep(2)
print(f"Process {num} finished")

if __name__ == "__main__":
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
processes.append(p)
p.start()

for p in processes:
p.join()

print("All processes finished.")

在這段程式碼中,我們使用 multiprocessing.Process 創建了五個獨立的進程,每個進程都會執行 worker 函數。

使用進程池方式

對於需要創建大量進程的情況,可以使用進程池來管理進程:

import multiprocessing
import time

def worker(num):
print(f"Process {num} starting")
time.sleep(2)
print(f"Process {num} finished")

if __name__ == "__main__":
with multiprocessing.Pool(processes=5) as pool:
pool.map(worker, range(5))

print("All processes finished.")

這裡,我們使用 Pool 來創建一組工作進程,並使用 map 方法將任務分配給這些進程。

多執行緒 vs. 多進程

raw-image


選擇建議

  • 如果你的應用主要是 I/O 密集型,例如網路請求或檔案操作,則應選擇 多執行緒
  • 如果你的應用需要大量計算,則應選擇 多進程 以充分利用 CPU 核心。

結論

在 Python 中,使用 threading 和 multiprocessing 模組可以有效地實現並行處理。根據任務的特性選擇合適的方法,可以顯著提高程式的性能。希望這篇文章能幫助你理解如何在 Python 中實現平行程序設計!


avatar-img
追極光的北極熊|軟體工程師的小天地
7會員
124內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言
avatar-img
留言分享你的想法!
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!