2025年1月7日 星期二

Python 多執行緒(Multithreading)

 

多執行緒(Multithreading)

多執行緒是一種在同一程序中同時執行多個執行緒的技術,主要用於提升程式的執行效率。Python 提供了 threading 模組來實現多執行緒。以下是一個簡單的多執行緒範例:
python
import threading import time def thread_function(name): print(f"Thread {name}: starting") time.sleep(2) print(f"Thread {name}: finishing") threads = [] for index in range(5): thread = threading.Thread(target=thread_function, args=(index,)) threads.append(thread) thread.start() for thread in threads: thread.join() # 等待所有執行緒完成
在這個範例中,我們創建了五個執行緒,每個執行緒都會呼叫 thread_function 函數。使用 join() 方法可以確保主執行緒等待所有子執行緒完成後再繼續執行。這種方式特別適合處理 I/O 密集型任務,如網頁爬蟲或檔案讀寫等
2
4
6

結論

類別和多執行緒是 Python 中強大的工具。類別使得程式碼更具結構性和可重用性,而多執行緒則能有效提升程式的性能,特別是在需要同時處理多項任務時。這兩者的結合可以幫助開發者創建更高效且易於維護的應用程式。

在 Python 中,將 類別(Class) 與 多執行緒(Multithreading) 結合使用,可以有效地組織和管理執行緒的行為。以下是如何在類別中實現多執行緒的基本方法與示例。

使用類別實現多執行緒

1. 繼承 threading.Thread 類別

可以通過創建一個繼承自 threading.Thread 的類別來定義執行緒。在這個類別中,重寫 run() 方法以指定執行緒要執行的程式碼。
python
import threading import time class MyThread(threading.Thread): def __init__(self, name): super().__init__() self.name = name def run(self): for i in range(5): time.sleep(0.5) print(f"{self.name}: {i}") # 創建執行緒實例 thread1 = MyThread("Thread A") thread2 = MyThread("Thread B") # 啟動執行緒 thread1.start() thread2.start() # 等待所有執行緒完成 thread1.join() thread2.join()
在這個示例中,MyThread 類別定義了一個名為 run 的方法,這是每個執行緒啟動後要執行的程式碼。然後創建兩個 MyThread 的實例並啟動它們。

2. 使用鎖(Lock)來保護共享資源

在多執行緒環境中,如果多個執行緒同時訪問共享資源,可能會導致數據競爭。可以使用 Lock 來確保同一時間只有一個執行緒可以訪問共享資源。
python
class SafeCounter(threading.Thread): lock = threading.Lock() count = 0 def run(self): global count for _ in range(1000): with SafeCounter.lock: SafeCounter.count += 1 threads = [] for _ in range(10): thread = SafeCounter() thread.start() threads.append(thread) for thread in threads: thread.join() print(f"Final count: {SafeCounter.count}")
在這個範例中,SafeCounter 類別使用鎖來保護對共享變數 count 的訪問。每當一個執行緒想要更新 count 時,它必須首先獲取鎖,這樣可以避免數據競爭。

3. 使用事件(Event)

除了鎖之外,還可以使用事件來協調不同執行緒之間的操作。例如,可以讓一個執行緒等待另一個執行緒完成某些工作後再繼續。
python
class EventThread(threading.Thread): def __init__(self, event): super().__init__() self.event = event def run(self): print("Waiting for event to be set...") self.event.wait() # 等待事件被設置 print("Event has been set, continuing execution.") event = threading.Event() thread = EventThread(event) thread.start() time.sleep(2) # 模擬一些工作 event.set() # 設置事件,讓等待的執行緒繼續
在這個示例中,EventThread 類別中的 run() 方法會等待事件被設置。主程式在等待兩秒後設置事件,這樣 EventThread 就可以繼續其執行。

結論

將類別與多執行緒結合使用,可以使得程式碼更具結構性和可讀性。透過繼承 threading.Thread、使用鎖和事件等技術,可以有效地管理多個執行緒之間的交互與資源共享。這樣的設計不僅提升了程式的性能,也增強了其可維護性。



沒有留言:

張貼留言

dorowu/ubuntu-desktop-lxde-vnc:bionic-lxqt Docker 映像介紹

 dorowu/ubuntu-desktop-lxde-vnc:bionic-lxqt Docker 映像介紹 1. 基本概述 名稱: dorowu/ubuntu-desktop-lxde-vnc:bionic-lxqt 維護者: Dorowu 用途: 提供基於 Ub...