Python如何實現多線程編程?threading模塊使用詳解

python中使用Threading模塊進行線程編程,1.通過創建thread對象并調用start()啟動線程;2.使用target指定執行函數,args/kwargs傳參;3.join()方法可使主線程等待子線程結束;4.設置daemon=true可將線程設為守護線程;5.使用lock解決資源共享時的競爭問題。例如導入threading后定義目標函數,再創建線程實例傳入函數及參數,調用start()開啟線程,若需同步則用join(),若需后臺運行則設置守護模式,共享資源訪問時通過加鎖保證安全。

Python如何實現多線程編程?threading模塊使用詳解

多線程在python中是一個常被提到的概念,尤其是當我們想提升程序效率、實現并發操作時。但很多人一開始都會有點懵:為什么Python的多線程好像并不能真正并行?其實這和GIL(全局解釋器鎖)有關,不過今天不聊這個,我們主要講怎么用threading模塊做多線程編程

Python如何實現多線程編程?threading模塊使用詳解


創建線程的基本方式

threading是Python標準庫中用于多線程編程的核心模塊。最簡單的使用方法就是創建一個Thread對象,并傳入你要在線程中執行的函數。

Python如何實現多線程編程?threading模塊使用詳解

比如:

立即學習Python免費學習筆記(深入)”;

import threading  def say_hello():     print("Hello from thread!")  t = threading.Thread(target=say_hello) t.start()

這段代碼會啟動一個新的線程去執行say_hello函數。注意:調用start()之后,線程才會真正開始運行;直接調用t()不會開啟新線程。

Python如何實現多線程編程?threading模塊使用詳解

你也可以給目標函數傳遞參數:

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已經夠用了。


基本上就這些。多線程雖然看起來簡單,但實際使用中還是有很多細節需要注意,比如線程安全、死鎖、資源競爭等問題。剛開始的時候建議從簡單的例子入手,逐步加深理解。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享