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中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...