python訊號量 Python訊號量

2021-10-22 12:12:57 字數 2992 閱讀 9658

python訊號量教程

訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。

也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而

python訊號量與互斥鎖的關係

訊號量的乙個特殊用法是互斥量。互斥量是初始值為 1 的訊號量,可以實現資料、資源的互斥訪問。

python訊號量使用詳解

語法import threading

sem = threading.semaphore(3)

sem.acquire()

sem.release()

說明首先,我們需要使用 threading.semaphore 建立乙個訊號量的例項,建立例項時,需要指定乙個 value

接著,在我們對臨界資源進行訪問的時候,呼叫 acquire(),此時內建計數器 -1,直到為 0 的時候就阻塞。資源呼叫完畢後呼叫 release(),內建計數器 +1,並讓某個執行緒的 acquire() 從阻塞變為不阻塞。

案例python多執行緒訊號量使用

使用 threading.semaphore 訊號量控制多執行緒

import threading

import time

def run(n):

semaphore.acquire()

time.sleep(1)

print("thread:%s is running" % n)

semaphore.release()

if __name__ == '__main__':

print("嗨客網(www.haicoder.net)")

semaphore = threading.semaphore(3) #最多允許3個執行緒同時執行

for i in range(3):

t = threading.thread(target=run, args=(i,))

t.start()

while threading.active_count() != 1:

pass

else:

print('----all threads done---')

程式執行後,控制台輸出如下:

我們在接著,我們使用

從執行結果來看,我們的執行緒的確是併發執行的,理論上三個執行緒完全可以同時執行,最後的

python多執行緒訊號量使用

使用 threading.semaphore 訊號量控制多執行緒

import threading

import time

class htmlspider(threading.thread):

def __init__(self, url, sem):

super().__init__()

self.url = url

self.sem = sem

def run(self):

time.sleep(2)

print("got haicoder text success")

self.sem.release() # 內部維護的計數器加1,並通知內部維護的conditon通知acquire

class urlproducer(threading.thread):

def __init__(self, sem):

super().__init__()

self.sem = sem

def run(self):

for i in range(20):

self.sem.acquire() # 內部維護的計數器減1,到0就會阻塞

html_thread = htmlspider("".format(i), self.sem)

html_thread.start()

if __name__ == "__main__":

print("嗨客網(www.haicoder.net)")

sem = threading.semaphore(3) #設定同時最多3個

url_producer = urlproducer(sem)

url_producer.start()

程式執行後,控制台輸出如下:

我們在 main 函式中,首先使用了 threading.semaphore 建立了乙個訊號量,同時,傳入了引數 3,即最多允許 3 個執行緒同時併發的執行。接著,我們建立了乙個 urlproducer 執行緒,用來模擬爬取 url,同時在 urlproducer 執行緒裡,我們使用 for 迴圈一次性開啟了 20 個 htmlspider 執行緒,用來模擬爬取 url 對應的網頁。

這裡,如果我們直接開 20 個 htmlspider 執行緒,20 個執行緒是同時執行的,可能會造成伺服器的壓力過大,所以我們為了限制一次性最多隻允許 3 個執行緒同時爬取,這裡在每開啟乙個執行緒 htmlspider 之前,我們都使用 acquire() 函式獲取乙個資源,每次 htmlspider 執行緒執行結束,我們使用 release() 函式,釋放資源。

從執行結果來看,我們的執行緒的確是併發執行的,理論上三個執行緒完全可以同時執行,因此,在這裡,我們通過訊號量實現了模擬控制爬蟲的執行緒數的場景。

python訊號量教程總結

訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。

也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而互斥鎖同時只允許乙個執行緒更改資料。python訊號量使用語法:

import threading

sem = threading.semaphore(3)

sem.acquire()

sem.release()

python 程序訊號量

1 概念 訊號量和鎖相似,鎖同一時間只允許乙個物件 程序 通過,訊號量同一時間允許多個物件 程序 通過 2 應用場景 多執行緒,並規定數量 3 格式 匯入訊號量模組 例項化訊號量物件,可以規定訊號量的個數 傳遞物件 拿到一把鑰匙 釋放一把鑰匙 4 過程 獲得鑰匙,當鑰匙串沒鑰匙時,其它程序要在外面等...

python 訊號量 python學習之訊號量

01 訊號量 1 概述 訊號量是用來控制線程併發數的。2 原理 boundedsemaphore和semaphore管理乙個內建的計數器。每當資源釋放遞增時 呼叫acquire 計數器 1,資源消耗時遞減 呼叫release 計數器 1。3 呼叫格式 threading.boundedsemapho...

訊號量 二值訊號量

訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...