Python - 創建線程

嗨,有抱負的 Python 程式設計師們!今天,我們將進入線程的精彩世界。如果你以前從未聽過線程,也別擔心——我們將從頭開始,逐步學習。在這篇教程結束時,你將能像專家一樣創建線程!

Python - Creating a Thread

線程是什麼?

在我們開始創建線程之前,先來了解線程是什麼。想像你正在烹飪一頓複雜的飯菜。你不是一件一件地做——你可能在一個爐灶上煮義大利麵,同時在砧板上切菜。這就是線程在程式設計中如何運作的一個類比。線程允許你的程式的不同部分同時運行,使你的代碼更有效率。

使用函數創建線程

在 Python 中創建線程的最簡單方式是使用函數。我們從一個基本的例子開始:

import threading
import time

def print_numbers():
for i in range(5):
print(f"Number {i}")
time.sleep(1)

# 創建一個線程
thread = threading.Thread(target=print_numbers)

# 開始線程
thread.start()

print("主線程繼續運行")

# 等待線程完成
thread.join()

print("線程已完成")

讓我們來分解一下:

  1. 我們導入了 threading 模組,它提供了我們操作線程所需的工具。
  2. 我們定義了一個簡單的函數 print_numbers(),它會從 0 開始打印數字到 4,每打印一次間隔 1 秒。
  3. 我們使用 threading.Thread() 創建了一個線程,並指定我們的函數作為 target
  4. 我們用 thread.start() 開始線程。
  5. 主程式繼續運行,打印 "主線程繼續運行"。
  6. 我們使用 thread.join() 等待我們的線程完成後再繼續。

當你運行這個程序時,你會看到 "主線程繼續運行" 馬上被打印出來,而數字則在背景中打印。這就是線程的力量!

通過擴展線程類創建線程

創建線程的另一種方法是擴展 Thread 類。當你想要創建一個可重用的線程物件時,這種方法很有用。以下是一個例子:

import threading
import time

class NumberPrinter(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name

def run(self):
for i in range(5):
print(f"{self.name}: Number {i}")
time.sleep(1)

# 創建兩個線程
thread1 = NumberPrinter("線程 1")
thread2 = NumberPrinter("線程 2")

# 開始線程
thread1.start()
thread2.start()

print("主線程繼續運行")

# 等待兩個線程完成
thread1.join()
thread2.join()

print("兩個線程都已經完成")

在這個例子中:

  1. 我們定義了一個 NumberPrinter 類,它擴展了 threading.Thread
  2. 我們重寫了 __init__ 方法,以接收我們線程的名稱。
  3. 我們重寫了 run 方法,這是在線程啟動時被調用的。
  4. 我們創建了我們 NumberPrinter 類的兩個實例並啟動它們。
  5. 兩個線程同時運行,打印她們的數字。

這種方法讓我們對線程有更多的控制,並且可以輕鬆地創建多個實例。

使用 start_new_thread() 函數創建線程

在 Python 中創建線程還有第三種方法,就是使用 _thread 模塊的 start_new_thread() 函數。然而,這種方法被認為是低階的,並不適用於大多數情況。以下是一個為了完整性而提供的例子:

import _thread
import time

def print_numbers(thread_name):
for i in range(5):
print(f"{thread_name}: Number {i}")
time.sleep(1)

# 開始兩個新的線程
try:
_thread.start_new_thread(print_numbers, ("線程 1",))
_thread.start_new_thread(print_numbers, ("線程 2",))
except:
print("錯誤:無法啟動線程")

# 保持主線程活著
time.sleep(6)
print("主線程退出")

這種方法比較不靈活,且沒有前述方法提供的那麼多的控制。使用這種方法來等待線程完成也比較困難。

線程創建方法的對比

以下是三種我們討論過的方法的快速對比:

方法 優點 缺點
使用函數 實現簡單,適合一次性任務 重用性較低,控制有限
擴展線程類 可重用,控制較多,面向物件 設置較複雜
start_new_thread() 低階控制 管理困難,較不靈活,不推薦

結論

恭喜你!你已經在 Python 的線程世界中邁出了第一步。我們已經涵蓋了三種不同的創建線程的方法,每種都有其自己的優點和用例。請記住,線程可以使你的程序更有效率,但也引入了複雜性。當你繼續你的 Python 過程時,你會學習更多關於何時以及如何有效地使用線程。

繼續練習,你將能像資深程式設計師一樣使用線程。 coding 愉快!

Credits: Image by storyset