python的Threading模塊適合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實現多線程并不復雜,但要特別注意并發控制和資源競爭的問題。只要搞清楚適用場景、線程生命周期、同步機制這幾個關鍵點,就可以寫出穩定可靠的多線程程序了。