非同步 訊號量

2021-09-09 05:33:13 字數 1915 閱讀 5818

1 自己手動 釋放

from tornado import gen

from tornado.ioloop import ioloop

from tornado.locks import semaphore

sem = semaphore(2)

async

defworker

(worker_id)

:await sem.acquire(

)try

:print

("worker %d is working"

% worker_id)

await use_some_resource(

)finally

:print

("worker %d is done"

% worker_id)

sem.release(

)async

defrunner()

:# join all workers.

await gen.multi(

[worker(i)

for i in

range(3

)])ioloop.current(

).run_sync(runner)

2 使用上下文管理 with 自動釋放

async

defworker

(worker_id)

:async

with sem:

print

("worker %d is working"

% worker_id)

await use_some_resource(

)# now the semaphore has been released.

print

("worker %d is done"

% worker_id)

上面的tornado sem = semaphore(2) 允許啟用2個這個協程

現在放入執行緒中來說, 執行緒間同步之訊號量semaphore

訊號量是控制進入數量的鎖。 應用場景, 比如再讀寫檔案的時候, 一般只能有乙個檔案在寫, 而讀可以有多個執行緒同時進行,如果需要限制同時讀取檔案的個數, 這個時候可以用到訊號量(如果用互斥鎖, 就是限制同一時刻只能有乙個執行緒讀取檔案)。又比如再做爬蟲的時候, 有時候跑去速度太快, 會被**禁止, 這個時候就要控制爬取的頻率的。

如果在主機執行io密集型任務的時候再執行這種型別的程式時,計算機就有很大可能會宕機。

這時候就可以為這段程式新增乙個計數器功能,來限制乙個時間點內的執行緒數量。

當我們在分析網路**客戶端來說, 一定要使用某種限流機制, 防止向伺服器發起太多併發請求。如果伺服器負載過大, 那麼系統的整體效能可能會降低。在多執行緒中可以使用 執行緒池, 在非同步請求中就像tornado 中使用訊號量。限制協程的數量,semaphore 物件維護著乙個內部計數器,若在物件上呼叫 .acquire() 協程方法,計數

器則遞減;若在物件上呼叫 .release() 協程方法,計數器則遞增。計數器的初始值在實

例化 semaphore 時設定

就像asyncio 中訊號量

semaphore = asyncio.semaphore(concur_req)
如果計數器大於零,那麼呼叫 .acquire() 方法不會阻塞;可是,如果計數器為零,那麼

.acquire() 方法會阻塞呼叫這個方法的協程,直到其他協程在同乙個 semaphore 物件

上呼叫 .release() 方法,讓計數器遞增

總結:

在多執行緒中

訊號量semaphore 可以控制同時執行執行的執行緒數量。

訊號量semaphore內部維護了乙個條件變數和乙個計數器。

訊號量與非同步通知

訊號量與非同步通知一 訊號量原理概述1 linux 當中的訊號處理機制程序管理塊 pcb 中有幾個位元組的位元位,每乙個位元位代表著一種訊號。程序首先要註冊乙個函式用於處理對應的訊號,一般來說呼叫signal 或者是signalaction 函式。當用kill 指令向某乙個程序傳送訊號,就會陷入核心...

Linux非同步 訊號量集

在實際的應用中乙個應用程式需要對多個訊號進行處理,為了方便,linux系統引進了訊號集的概念。訊號集用多個訊號組成的資料型別sigset t.可用以下的系統呼叫設定訊號集中所包含的資料。1 sigset t在 include asm generic signal.h中定義。typedef struc...

訊號量 二值訊號量

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