python中使用Threading模塊進行多線程編程,1.通過創建thread對象并調用start()啟動線程;2.使用target指定執行函數,args/kwargs傳參;3.join()方法可使主線程等待子線程結束;4.設置daemon=true可將線程設為守護線程;5.使用lock解決資源共享時的競爭問題。例如導入threading后定義目標函數,再創建線程實例傳入函數及參數,調用start()開啟線程,若需同步則用join(),若需后臺運行則設置守護模式,共享資源訪問時通過加鎖保證安全。
多線程在python中是一個常被提到的概念,尤其是當我們想提升程序效率、實現并發操作時。但很多人一開始都會有點懵:為什么Python的多線程好像并不能真正并行?其實這和GIL(全局解釋器鎖)有關,不過今天不聊這個,我們主要講怎么用threading模塊做多線程編程。
創建線程的基本方式
threading是Python標準庫中用于多線程編程的核心模塊。最簡單的使用方法就是創建一個Thread對象,并傳入你要在線程中執行的函數。
比如:
立即學習“Python免費學習筆記(深入)”;
import threading def say_hello(): print("Hello from thread!") t = threading.Thread(target=say_hello) t.start()
這段代碼會啟動一個新的線程去執行say_hello函數。注意:調用start()之后,線程才會真正開始運行;直接調用t()不會開啟新線程。
你也可以給目標函數傳遞參數:
def greet(name): print(f"Hello, {name}!") t = threading.Thread(target=greet, args=("Alice",)) t.start()
- 使用target指定要執行的函數
- 使用args傳入位置參數(記得加逗號,變成元組)
- 使用kwargs傳入關鍵字參數
等待線程結束:join() 方法
如果你希望主線程等某個子線程完成后再繼續執行,可以使用join()方法。
比如:
立即學習“Python免費學習筆記(深入)”;
t = threading.Thread(target=do_something) t.start() t.join() print("主線程繼續執行")
這樣,主線程會在t線程執行完畢后才打印那句話。
有些時候你會看到多個線程一起join(),例如:
threads = [] for _ in range(5): t = threading.Thread(target=task) t.start() threads.append(t) for t in threads: t.join()
這樣做的目的是確保所有子線程都執行完,主線程才繼續往下走。
守護線程與非守護線程的區別
默認情況下,線程是非守護線程(daemon=False)。這意味著主線程退出前會等待這些線程執行完畢。
如果你想讓線程隨著主線程退出而自動終止,可以把線程設為守護線程:
t = threading.Thread(target=background_task, daemon=True) t.start()
或者設置屬性:
t.daemon = True
注意:一定要在調用start()之前設置daemon屬性。
常見用途包括后臺日志記錄、心跳檢測等不需要等待的任務。
多線程中的資源共享問題
當多個線程訪問共享資源時,可能會出現競爭條件(race condition),這時候就需要加鎖保護。
Python提供了threading.Lock()來解決這個問題:
lock = threading.Lock() def safe_increment(): global counter with lock: temp = counter temp += 1 counter = temp
上面的例子中,with lock:保證了每次只有一個線程能進入該代碼塊,避免數據混亂。
當然還有更高級的鎖機制,比如:
- RLock:可重入鎖,允許同一線程多次獲取同一個鎖
- Condition:用于線程間通信
- Semaphore:控制同時訪問的線程數量
但在大多數簡單場景下,Lock已經夠用了。
基本上就這些。多線程雖然看起來簡單,但實際使用中還是有很多細節需要注意,比如線程安全、死鎖、資源競爭等問題。剛開始的時候建議從簡單的例子入手,逐步加深理解。