🌈個人主頁: 程序員不想敲代碼啊
🏆CSDN優質創作者,CSDN實力新星,CSDN博客專家
👍點贊?評論?收藏
🤝希望本文對您有所裨益,如有不足之處,歡迎在評論區提出指正,讓我們共同學習、交流進步!
🎶Python多線程
- 🎶1. 前言
- 🎶2. threading 模塊的基本用法
- 🎶3. Thread類
- 🎶4. 鎖(Locks)
- 🎶5. 守護線程(Daemon Threads)
- 🎶6. 運用場景
- 🎶7. 弊端
🎶1. 前言
🚨Python
中的多線程通過threading
模塊來實現,它允許你并發執行多個線程,線程是操作系統能夠獨立調度的最小單位,它通常被用來執行并行任務。
🚨在解釋Python的多線程之前,需要注意的是,由于全局解釋器鎖(Global Interpreter Lock,GIL)的存在,CPython(Python的主要實現版本)中的多線程通常不能在多個CPU核心中并行執行,GIL確保一次只有一個線程在Python對象上執行操作,防止并發訪問導致的狀態不一致。因此,Python的多線程更適用于I/O密集型任務而非CPU密集型任務。
🎶2. threading 模塊的基本用法
🚨以下是使用threading
模塊創建和啟動一個線程的基本例子:
import threading
import time# 定義一個函數用于線程執行
def my_function(arg1, arg2):for i in range(arg1, arg2):print(f"Thread running: {i}")time.sleep(1) # 模擬耗時操作# 創建線程
thread = threading.Thread(target=my_function, args=(1, 10))# 啟動線程
thread.start()# 在主線程中繼續執行其他操作
for i in range(20, 25):print(f"Main thread running: {i}")time.sleep(1)# 等待直到線程完成
thread.join()
🎶3. Thread類
🚨在threading
模塊里,Thread
是一個代表線程的類,你可以創建一個Thread
類的實例并調用它的start()
方法來運行新線程。每個Thread
可以運行一個函數或方法。
🚨除了直接使用threading.Thread
,你也可以通過繼承Thread
類來定義新的線程子類,重寫其中的run()
方法:
class MyThread(threading.Thread):def __init__(self, arg1, arg2):super().__init__()self.arg1 = arg1self.arg2 = arg2def run(self):for i in range(self.arg1, self.arg2):print(f"Running from the extended thread class: {i}")time.sleep(1)# 使用自定義線程類
thread = MyThread(1, 5)
thread.start()
thread.join()
🎶4. 鎖(Locks)
🚨鎖是一個同步原語,用于防止多個線程同時訪問共享資源,在Python中,你可以使用threading.Lock()
來創建一個鎖。鎖有兩個基本方法,acquire()
和release()
。當一個線程通過調用acquire()
獲得了鎖,它會阻止其他線程獲取直到它調用release()
釋放鎖。
# 創建一個鎖
lock = threading.Lock()# 在需要訪問共享資源前獲取鎖
lock.acquire()# 訪問共享資源
# ...# 完成共享資源的訪問后釋放鎖
lock.release()
🚨可以使用 with
語句簡化以上模式,這樣可以保證鎖被正確釋放:
with lock:# 訪問共享資源# ...
🎶5. 守護線程(Daemon Threads)
🚨守護線程是一種特殊的線程,它在主線程退出時也會隨之退出,與常規線程相比,守護線程不用等待它完成才能退出程序。通過設置線程的daemon
屬性為True
,可以將線程聲明為守護線程:
thread = threading.Thread(target=my_function, args=(1, 10))
thread.daemon = True
thread.start()
🎶6. 運用場景
🚨在Python中,多線程經常被用于處理I/O密集型任務,例如文件讀寫、網絡通訊等等。對于CPU密集型任務,多進程通常是更好的選擇。
🎶7. 弊端
🚨由于GIL的存在,在CPython的多線程程序不會真正地并行執行多線程,即使在多核CPU上。為了克服這個限制,可以考慮使用multiprocessing
模塊,這個模塊通過創建多個進程來實現真正的并行計算(每個進程有自己的GIL)。當然,每個場景下都需要仔細考慮是否適合多線程、多進程或者其他解決方案,比如異步編程(asyncio
)或者其他并發框架(如concurrent.futures
)。