Python - 主線程

你好,有抱負的程式設計師!今天,我們將進入Python線程的世界,專注於主線程的探險之旅。作為你友善的鄰居電腦科學老師,我將引導你通過這個迷人的主題。如果你是程式設計的新手,不必擔心——我們將從基礎開始,逐步進階。所以,拿起你最喜愛的飲料,放鬆身心,讓我們一起深入吧!

Python - Main Thread

什麼是主線程?

在我們深入細節之前,先來了解什麼是線程。想像你一边讀書一邊聽音樂。你的大腦同時進行兩個任務——這就是線程在程式設計中的運作方式。主線程就像是你程式的 主故事線,當你運行Python腳本時就會啟動。

主線程的運作

讓我們從一個簡單的例子來看看主線程的運作:

import threading
import time

def print_current_thread():
print(f"當前線程: {threading.current_thread().name}")

print_current_thread()
time.sleep(2)
print("主線程仍在運行!")

當你運行這個腳本時,你會看到像這樣的結果:

當前線程: MainThread
主線程仍在運行!

在這個例子中,我們使用threading模塊來存取關於當前線程的資訊。time.sleep(2)函數只是用來添加一點暫停,就像我們編程故事中的戲劇性省略。

存取主線程

現在我們已經看到主線程的運作,來學習如何直接存取它。Python為我們提供了一個方便的方法:

import threading

main_thread = threading.main_thread()
print(f"主線程名稱: {main_thread.name}")
print(f"主線程ID: {main_thread.ident}")

這個腳本將輸出像這樣的結果:

主線程名稱: MainThread
主線程ID: 140735268892672

ident是線程的唯一標識符。它就像線程的社會安全號碼——沒有兩個線程會有相同的ID。

檢查我們是否在主線程中

有時,你可能想檢查你的程式碼是否正在主線程中運行。以下是如何做到這一點:

import threading

def am_i_main():
return threading.current_thread() == threading.main_thread()

print(f"我們在主線程中嗎? {am_i_main()}")

def not_main():
print(f"現在我們在主線程中嗎? {am_i_main()}")

thread = threading.Thread(target=not_main)
thread.start()
thread.join()

這個腳本將輸出:

我们在主線程中嗎? True
現在我們在主線程中嗎? False

在這個例子中,我們創建了一個新的線程來運行not_main()函數。當我們從這個新線程中調用am_i_main()時,它會返回False

Python中的主線程行為

主線程在Python中有一些重要的行為需要理解。讓我們來探索它們!

主線程與程式終止

主線程的一個關鍵行為是,當它完成執行時,整個Python程式通常會終止。讓我們看看這是如何發揮作用的:

import threading
import time

def long_task():
print("開始一個長任務...")
time.sleep(5)
print("長任務已完成!")

thread = threading.Thread(target=long_task)
thread.start()

print("主線程已完成!")

如果你運行這個腳本,你可能會看到:

開始一個長任務...
主線程已完成!

注意,"長任務已完成!"的消息從未出現。這是因為主線程已經完成,程式在長任務完成之前就終止了。

守護線程與非守護線程

為了更好地理解主線程的行為,我們需要談談守護線程。守護線程就像是一個背景任務,不會阻止程式退出。讓我們修改我們之前的例子:

import threading
import time

def long_task():
print("開始一個長任務...")
time.sleep(5)
print("長任務已完成!")

thread = threading.Thread(target=long_task)
thread.daemon = True  # 設定線程為守護線程
thread.start()

print("主線程已完成!")

輸出將與之前一樣。然而,如果我們刪除thread.daemon = True這行,我們將會看到:

開始一個長任務...
主線程已完成!
長任務已完成!

這是因為非守護線程(預設)會阻止程式退出,直到它們完成。

主線程等待其他線程

通常,你會希望你的主線程在結束程式之前等待其他線程完成。Python提供了一個簡單的方法來實現這一點:

import threading
import time

def task(name):
print(f"任務 {name} 開始...")
time.sleep(2)
print(f"任務 {name} 完成!")

threads = []
for i in range(3):
t = threading.Thread(target=task, args=(f"T{i}",))
threads.append(t)
t.start()

for t in threads:
t.join()

print("所有任務已完成!")

這個腳本將輸出:

任務 T0 開始...
任務 T1 開始...
任務 T2 開始...
任務 T0 完成!
任務 T1 完成!
任務 T2 完成!
所有任務已完成!

join()方法讓主線程等待每個線程完成它們的工作。

有用的線程方法表格

以下是我們討論過的一些有用線程方法以及一些其他方法的表格:

方法 描述
threading.current_thread() 返回當前的Thread對象
threading.main_thread() 返回主Thread對象
Thread.start() 開始線程的活動
Thread.join() 等待直到線程終止
Thread.is_alive() 返回線程是否活著
Thread.setDaemon(bool) 設定線程的守護標誌

結論

恭喜你!你已經踏出了Python線程世界的第一步。我們涵蓋了主線程、如何存取它、它的行為以及它如何與其他線程交互。請記住,線程可能是一個複雜的主題,但經過練習,你會對它感到更加自在。

在我們結束之前,我想起了著名電腦科學家Alan Kay的一句話:"預測未來的最好方法就是創造它。"有了你對Python線程的新知識,你現在已經有能力創造一些驚人的多線程程式!

繼續編程,繼續學習,最重要的是,玩得開心!下次再見,編織快樂!

Credits: Image by storyset