Python 信號量

在下面的教程中,我們將藉助 Python 中的 Semaphore 了解多線程同步。

讓我們從理解 Python 信號量開始。

理解信號量

  1. 信號量是一種同步結構。
  2. 信號量為線程提供了對有限資源的同步訪問。
  3. 信號量可以被視為反映當前現有資源數量的變數。例如,在一個購物中心的停車場中,有幾個特定級別的空位可以用作信號量。
  4. 信號量值不能小於零,也不能大於現有資源的總數。
  5. 信號量與兩個操作相關聯- 獲取和釋放。
  6. 當其中一個資源使用信號量進行同步時,該信號量的值會遞減。
  7. 當其中一個資源使用信號量進行同步時,線程釋放信號量,信號量的值遞增。
  8. 信號量的概念是由荷蘭計算機科學家埃德格·迪克斯特拉創造的。
  9. 信號量的兩個操作,即獲取和釋放,分別由 Dijkstra 表示為 p 和 v ,其中 p 和 v 是荷蘭語單詞 proberen 和vehiogen的首字母。
  10. 單詞 proberen 代表測試,而vehiogen代表荷蘭語中的增量。

現在讓我們理解 Python 編程語言中的信號量。

理解 Python 信號量

  1. 一類線程模塊用於實現 Python 中信號量的概念。這個類被稱為信號量
  2. Semaphore 類由一個構造器和兩個函數組成,分別是 acquire() 和 release() 。
  3. acquire() 功能用於在計數大於零時減少信號量的計數。否則它會阻塞,直到計數大於零。
  4. 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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-26 13:13
下一篇 2024-12-26 13:13

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論