在下面的教程中,我們將藉助 Python 中的 Semaphore 了解多線程同步。
讓我們從理解 Python 信號量開始。
理解信號量
- 信號量是一種同步結構。
- 信號量為線程提供了對有限資源的同步訪問。
- 信號量可以被視為反映當前現有資源數量的變數。例如,在一個購物中心的停車場中,有幾個特定級別的空位可以用作信號量。
- 信號量值不能小於零,也不能大於現有資源的總數。
- 信號量與兩個操作相關聯- 獲取和釋放。
- 當其中一個資源使用信號量進行同步時,該信號量的值會遞減。
- 當其中一個資源使用信號量進行同步時,線程釋放信號量,信號量的值遞增。
- 信號量的概念是由荷蘭計算機科學家埃德格·迪克斯特拉創造的。
- 信號量的兩個操作,即獲取和釋放,分別由 Dijkstra 表示為 p 和 v ,其中 p 和 v 是荷蘭語單詞 proberen 和vehiogen的首字母。
- 單詞 proberen 代表測試,而vehiogen代表荷蘭語中的增量。
現在讓我們理解 Python 編程語言中的信號量。
理解 Python 信號量
- 一類線程模塊用於實現 Python 中信號量的概念。這個類被稱為信號量
- Semaphore 類由一個構造器和兩個函數組成,分別是 acquire() 和 release() 。
- acquire() 功能用於在計數大於零時減少信號量的計數。否則它會阻塞,直到計數大於零。
- release() 函數用於增加信號量的計數和喚醒等待信號量的一個線程。
讓我們考慮下面的語法來創建一個信號量對象。
語法:
object_name = Semaphore(count)
說明:
在上面的語法中,對象名是信號量類的對象。信號量類的「計數」參數是允許同時訪問的線程數。此參數的默認值為 1。
每當線程執行 acquire() 功能時,「計數參數的值將遞減 1。每當線程執行釋放()功能時,計數參數的值將增加 1。這種說法意味著,每當我們調用 acquire() 方法時, count 參數值會遞減,而調用 release() 方法時, count 參數值會遞增。
創建信號量對象的方法
情況 1: 在下面的情況中,我們在創建對象時沒有在 Semaphore 類中指定參數。因此,計數變數的值為 1,因此只允許線程訪問。本案正是鎖定概念的翻版。
其語法如下所示:
語法:
object_name.Semaphore()
情況 2: 在下面的情況中,信號量類的一個對象可以由「 n 線程一次訪問。剩餘的線程必須等到釋放信號量。
其語法如下所示:
語法:
object_name.Semaphore(n)
讓我們考慮下面的例子來正確理解完整的概念。
示例:
# importing the modules
from threading import *
import time
# creating thread instance where count = 3
my_obj = Semaphore(4)
# creating instance
def show(the_name):
# calling acquire method
my_obj.acquire()
for n in range(6):
print('Javatpoint, ', end = '')
time.sleep(1)
print(the_name)
# calling release method
my_obj.release()
# creating multiple thread
thread_1 = Thread(target = show , args = ('Thread 1',))
thread_2 = Thread(target = show , args = ('Thread 2',))
thread_3 = Thread(target = show , args = ('Thread 3',))
thread_4 = Thread(target = show , args = ('Thread 4',))
thread_5 = Thread(target = show , args = ('Thread 5',))
thread_6 = Thread(target = show , args = ('Thread 6',))
# calling the threads
thread_1.start()
thread_2.start()
thread_3.start()
thread_4.start()
thread_5.start()
thread_6.start()
輸出
Javatpoint, Javatpoint, Javatpoint, Javatpoint, Thread 1
Thread 3
Thread 4
Thread 2
Javatpoint, Javatpoint, Javatpoint, Javatpoint, Javatpoint, Javatpoint, Thread 1
Thread 5
Javatpoint, Javatpoint, Thread 6
Thread 3
Thread 4
Javatpoint, Javatpoint, Thread 2
Javatpoint, Javatpoint, Thread 5
Javatpoint, Thread 1
Javatpoint, Thread 3
Javatpoint, Thread 6
Thread 2
Thread 4
Javatpoint, Javatpoint, Javatpoint, Thread 5
Javatpoint, Thread 1
Javatpoint, Thread 3
Javatpoint, Thread 6
Thread 2
Javatpoint, Javatpoint, Thread 4
Javatpoint, Thread 5
Javatpoint, Thread 1
Thread 3
Javatpoint, Javatpoint, Thread 2
Thread 6
Javatpoint, Javatpoint, Thread 4
Javatpoint, Thread 5
Javatpoint, Thread 1
Thread 3
Thread 2
Thread 6
Javatpoint, Thread 4
Thread 5
Thread 6
說明:
在上面的代碼片段中,我們已經導入了所需的模塊,並為計數值為 4 的 Semaphore 類創建了一個對象。然後,我們在對象上使用 acquire() 函數定義了一個函數。然後,我們使用 for-loop 將該值迭代到 6。然後我們調用了 release() 函數並創建了多個線程。最後,我們已經使用 start() 函數調用了線程。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/293216.html