更新於 2024/12/12閱讀時間約 7 分鐘

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

在這篇文章中,我們將深入探討 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. 多進程


選擇建議

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

結論

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


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.