Python - 創建線程
嗨,有抱負的 Python 程式設計師們!今天,我們將進入線程的精彩世界。如果你以前從未聽過線程,也別擔心——我們將從頭開始,逐步學習。在這篇教程結束時,你將能像專家一樣創建線程!
線程是什麼?
在我們開始創建線程之前,先來了解線程是什麼。想像你正在烹飪一頓複雜的飯菜。你不是一件一件地做——你可能在一個爐灶上煮義大利麵,同時在砧板上切菜。這就是線程在程式設計中如何運作的一個類比。線程允許你的程式的不同部分同時運行,使你的代碼更有效率。
使用函數創建線程
在 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("線程已完成")
讓我們來分解一下:
- 我們導入了
threading
模組,它提供了我們操作線程所需的工具。 - 我們定義了一個簡單的函數
print_numbers()
,它會從 0 開始打印數字到 4,每打印一次間隔 1 秒。 - 我們使用
threading.Thread()
創建了一個線程,並指定我們的函數作為target
。 - 我們用
thread.start()
開始線程。 - 主程式繼續運行,打印 "主線程繼續運行"。
- 我們使用
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("兩個線程都已經完成")
在這個例子中:
- 我們定義了一個
NumberPrinter
類,它擴展了threading.Thread
。 - 我們重寫了
__init__
方法,以接收我們線程的名稱。 - 我們重寫了
run
方法,這是在線程啟動時被調用的。 - 我們創建了我們
NumberPrinter
類的兩個實例並啟動它們。 - 兩個線程同時運行,打印她們的數字。
這種方法讓我們對線程有更多的控制,並且可以輕鬆地創建多個實例。
使用 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