Python執行緒專題5:訊號量與有邊界的訊號量

Mark發表於2019-02-16

上一篇文章:Python執行緒專題4:Timer物件、Lock物件、Rlock物件
下一篇文章:Python執行緒專題6:事件

訊號量與有邊界的訊號量

訊號量是一個基於計數器的同步原語,每次呼叫acquire()方法時,此計數器減1,每次呼叫release()方法時此計數器加1.。如果計數器為0,acquire()方法將會阻塞,直到有其他執行緒呼叫release()方法為止。

訊號量

語法:
s=Semqphore(value)
建立一個新的訊號量。value是計數器的初始值。如果省略value,將預設設定為1
常用方法:
s.acquire(blocking):獲取訊號量。如果內部計數器大於0,此方法將把它的值減1。
然後立即返回。如果它的值為0,此方法將阻塞,直到另一個執行緒呼叫release()方法為止。
blocking引數的行為與Lock和RLock物件中描述的相同。

s.release():通過將內部計數器的值加1來釋放一個訊號量。
如果計數器為0,而且另一個執行緒正在等待,該執行緒講被喚醒。
如果有多個執行緒正在等待,只能從它的acquire()的呼叫中返回一個,並且順序不確定。

有邊界的訊號量

語法:
bs=BoundedSemaphore(value)
建立一個新的有邊界訊號量。value是計數器的初始值,如果忽略,將預設為1.

訊號量與有邊界的訊號量的區別

BoundedSemaphore的工作方式與Semaphore完全相同,但release()操作的次數不能超過acquire()的操作次數。

訊號量與互斥鎖的微妙差別

訊號量可用於傳送訊號。例如,可以從不同執行緒呼叫acquire()和release()方法,以便在生產者和消費者執行緒之間進行通訊。

相關文章