Python 標(biāo)準(zhǔn)庫(kù) threading 多線程
多線程可以讓程序同時(shí)處理多個(gè)事情,線程之間共享內(nèi)存。
在 CPython 中存在 Global Interpreter Lock ( 全局解釋器鎖 ),GIL 設(shè)計(jì)之初是為了數(shù)據(jù)安全所做的決定,線程想要進(jìn)入 CPU 執(zhí)行必須先拿到鎖,但是 GIL 只有一個(gè),這意味著同一時(shí)間只能有一個(gè)線程在運(yùn)行,所有的線程使用同一顆 CPU 核心,使得它無(wú)法使用 CPU 的多核性能,所以 CPython 的這一特點(diǎn)會(huì)導(dǎo)致多線程在計(jì)算密集型任務(wù)上會(huì)比單線程要慢,它更適合處理 IO 密集型任務(wù)。
GIL 只在 CPython 中存在。
0.?threading 函數(shù)

1.?Thread 線程對(duì)象
1.1.?關(guān)于守護(hù)線程
當(dāng)程序退出時(shí),如果還有守護(hù)線程在運(yùn)行,程序會(huì)去強(qiáng)制終結(jié)所有守護(hù)線程,當(dāng)所有守護(hù)線程都終結(jié)后,程序才會(huì)真正退出。守護(hù)線程會(huì)在程序關(guān)閉時(shí)突然關(guān)閉,它們占用的資源可能沒(méi)有被正確釋放。
但程序退出時(shí),如果還有非守護(hù)線程在運(yùn)行,程序會(huì)等待直到所有非守護(hù)線程都結(jié)束后才會(huì)退出。一般創(chuàng)建的線程默認(rèn)是非守護(hù)線程,包括主線程。
1.2.?參數(shù)和方法
1.3.?代碼示例
通過(guò)實(shí)例化線程對(duì)象創(chuàng)建線程
通過(guò)繼承線程對(duì)象創(chuàng)建線程

2.?Lock 鎖對(duì)象
2.1.?關(guān)于鎖對(duì)象
threading.Lock 是直接通過(guò) _thread 模塊擴(kuò)展實(shí)現(xiàn)的。
當(dāng)鎖在被鎖定時(shí),它并不屬于某一個(gè)特定的線程。
鎖只有 “鎖定” 和 “非鎖定” 兩種狀態(tài),當(dāng)鎖被創(chuàng)建時(shí),是處于 “非鎖定” 狀態(tài)的。當(dāng)鎖已經(jīng)被鎖定時(shí),再次調(diào)用 acquire() 方法會(huì)被阻塞執(zhí)行,直到鎖被調(diào)用 release() 方法釋放掉鎖并將其狀態(tài)改為 “非鎖定” 。
同一個(gè)線程獲取鎖后,如果在釋放鎖之前再次獲取鎖會(huì)導(dǎo)致當(dāng)前線程阻塞,除非有另外的線程來(lái)釋放鎖,如果只有一個(gè)線程,并且發(fā)生了這種情況,會(huì)導(dǎo)致這個(gè)線程一直阻塞下去,即形成了死鎖。所以在獲取鎖時(shí)需要保證鎖已經(jīng)被釋放掉了,或者使用遞歸鎖來(lái)解決這種情況。
2.2. 參數(shù)和方法
2.3.?代碼示例

3.?RLock 遞歸鎖對(duì)象
3.1.?關(guān)于遞歸鎖對(duì)象
遞歸鎖加入了 “所屬線程” 和 “遞歸等級(jí)” 的概念,遞歸鎖必須由獲取鎖的線程來(lái)進(jìn)行釋放。
同一個(gè)線程在釋放鎖之前再次獲取鎖將不會(huì)阻塞當(dāng)前線程,而是在鎖的遞歸等級(jí)上加 1(獲得鎖時(shí)的初始遞歸等級(jí)為 1 )。
3.2.?方法和參數(shù)
3.3.?代碼示例

4.?Condition 條件對(duì)象
4.1.?關(guān)于條件對(duì)象
一個(gè)條件變量對(duì)象允許一個(gè)或多個(gè)線程等待,直到被另一個(gè)線程通知。
它的 wait() 方法釋放鎖,并阻塞線程直到其他線程調(diào)用 notify() 或 notify_all() 方法喚醒,然后 wait() 方法重新獲取鎖,也可以指定 timeout 超時(shí)時(shí)間。
它的 notify() 方法喚醒一個(gè)正在等待的線程,notify_all() 喚醒所有正在等待的線程。喚醒線程但是并不會(huì)釋放鎖,所以被喚醒的線程并不會(huì)立即從它們的 wait() 方法出返回并執(zhí)行,只有在調(diào)用了 notify() 或者 notify_all() 方法的線程放棄了鎖的所有權(quán)后才會(huì)返回對(duì)應(yīng)的線程并執(zhí)行,即先通知再釋放鎖。
4.2.?參數(shù)和方法
4.3.?代碼示例

5.?Semaphore 信號(hào)量對(duì)象
5.1.?關(guān)于信號(hào)量對(duì)象
一個(gè)信號(hào)量管理一個(gè)內(nèi)部計(jì)數(shù)器,acquire() 方法會(huì)減少計(jì)數(shù)器,release() 方法則增加計(jì)數(shù)器。
計(jì)數(shù)器的值永遠(yuǎn)不會(huì)小于零,當(dāng)調(diào)用 acquire() 時(shí),如果發(fā)現(xiàn)該計(jì)數(shù)器為零,則阻塞線程,直到調(diào)用 release() 方法使計(jì)數(shù)器增加。
5.2.?參數(shù)和方法
5.3.?代碼示例

6.?Event 事件對(duì)象
6.1.?關(guān)于事件對(duì)象
一個(gè)事件對(duì)象管理一個(gè)內(nèi)部標(biāo)志,初始狀態(tài)默認(rèn)為 False,set() 方法可將它設(shè)置為 True,clear() 方法可將它設(shè)置為 False,wait() 方法將線程阻塞直到內(nèi)部標(biāo)志的值為 True。
6.2.?參數(shù)和方法
6.3.?代碼示例

7.?Timer 定時(shí)器對(duì)象
7.1.?關(guān)于定時(shí)器對(duì)象
表示一個(gè)操作需要在等待一定時(shí)間之后執(zhí)行。Timer 類是 threading.Thread 的子類,所以它可以像一個(gè)自定義線程一樣工作。
和線程一樣,可以通過(guò) start() 方法啟動(dòng)定時(shí)器,在定時(shí)器計(jì)時(shí)結(jié)束之前及線程開(kāi)啟之前,可以使用 cancel() 方法停止計(jì)時(shí)器。計(jì)時(shí)器等待的時(shí)間可能與用戶設(shè)置的時(shí)間不完全一樣。
7.2.?參數(shù)和方法
-1.?最后
bilibili?專欄不太適合編輯這類文章
嘗試在我的博客瀏覽這篇文章
https://numlinka.com/numlinka/python-libs-threading.html