Python里多線程threading模塊 Python中threading模塊實現并發編程

pythonThreading模塊適合i/o密集型任務,如網絡請求、文件讀寫等。1. 線程適用于i/o密集型場景,能避免主線程卡住,但受gil限制,不適用于計算密集型任務,此時應使用multiprocessing模塊。2. 創建線程常用thread類并調用start()方法啟動,通過target指定函數,args傳入參數元組,需調用join()讓主線程等待子線程完成。3. 線程間共享數據需加鎖,使用threading.lock配合with語句確保操作原子性,防止資源競爭導致錯誤。4. 守護線程用于后臺任務,設置daemon=true后主線程結束時該線程自動終止,適合心跳檢測、日志記錄等無需手動干預的任務。掌握適用場景、線程創建與控制、同步機制是寫出穩定多線程程序的關鍵。

python中用threading模塊實現多線程并發編程,是很多初學者想掌握的內容。但實際使用中會遇到不少坑,比如GIL限制、資源共享沖突等。這篇文章就從實用角度出發,講清楚怎么用好這個模塊。


多線程適合做什么?

threading模塊適用于I/O密集型任務,比如網絡請求、文件讀寫、等待用戶輸入等場景。在這種情況下,多個線程可以輪流執行,避免主線程卡住。
例如,同時下載多個網頁內容,或者監聽多個設備的狀態變化,都是多線程的典型應用場景。

但要注意,由于Python有全局解釋器鎖(GIL),即使是多核CPU,在計算密集型任務中也難以通過多線程提升性能。這時候應該考慮用multiprocessing模塊。


怎么創建和啟動一個線程?

創建線程最常用的方法是使用Thread類,然后調用它的start()方法。示例代碼如下:

import threading  def say_hello(name):     print(f"Hello, {name}")  thread = threading.Thread(target=say_hello, args=("Tom",)) thread.start()

關鍵點:

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

  • target參數指定要在線程中運行的函數;
  • args傳入函數參數,注意要是元組形式;
  • 調用start()才會真正啟動線程,直接調用函數不會并發執行;

如果你希望主線程等待子線程完成再繼續執行,可以用join()方法:

thread.join()  # 主線程會在這里等待thread執行完畢

線程之間如何安全地共享數據?

線程共享同一進程的內存空間,所以它們可以訪問相同的變量。但也正因為如此,多個線程同時修改同一個變量時容易出錯。

舉個例子:兩個線程同時對一個計數器做加法操作,最終結果可能比預期少。這是因為“讀取-修改-寫入”不是一個原子操作,中間可能被打斷。

解決辦法是使用鎖機制,比如threading.Lock:

lock = threading.Lock()  def safe_increment():     global counter     with lock:         temp = counter         counter = temp + 1

這樣就能保證同一時間只有一個線程在操作counter變量。


守護線程是什么?什么時候用?

守護線程(daemon thread)是指不阻止主線程退出的線程。設置方式很簡單:

thread.daemon = True

或者在創建時指定:

threading.Thread(target=..., daemon=True)

守護線程適合做一些后臺任務,比如心跳檢測、日志記錄等。當主線程結束時,這些線程也會自動終止,不需要手動干預。


基本上就這些。用threading實現多線程并不復雜,但要特別注意并發控制和資源競爭的問題。只要搞清楚適用場景、線程生命周期同步機制這幾個關鍵點,就可以寫出穩定可靠的多線程程序了。

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