一、簡(jiǎn)述
信號(hào)量Semaphore是一個(gè)計(jì)數(shù)器澳厢,控制對(duì)公共資源或者臨界區(qū)域的訪問(wèn)量环础,信號(hào)量可以指定同時(shí)訪問(wèn)資源或者進(jìn)入臨界區(qū)域的進(jìn)程數(shù)。每次有一個(gè)進(jìn)程獲得信號(hào)量時(shí)剩拢,計(jì)數(shù)器-1线得,若計(jì)數(shù)器為0時(shí),其他進(jìn)程就停止訪問(wèn)信號(hào)量徐伐,一直阻塞直到其他進(jìn)程釋放信號(hào)量贯钩。
二、常用方法和屬性
- acquire(blocking = True, timeout=None)
- 請(qǐng)求一個(gè)信號(hào)量
- release()
- 釋放一個(gè)信號(hào)量
三办素、示例
import time, random
from multiprocessing import Process, Semaphore
def ktv(i, sem):
sem.acquire()
print('%s 走進(jìn)ktv' %i)
time.sleep(random.randint(1, 5))
print('%s 走出ktv' %i)
sem.release()
if __name__ == "__main__":
sem = Semaphore(4)
for i in range(5):
p = Process(target=ktv, args=(i, sem))
p.start()
運(yùn)行結(jié)果
0 走進(jìn)ktv
3 走進(jìn)ktv
4 走進(jìn)ktv
1 走進(jìn)ktv
1 走出ktv
2 走進(jìn)ktv
2 走出ktv
0 走出ktv
3 走出ktv
4 走出ktv
Process finished with exit code 0
示例說(shuō)明:
- Semaphore 主要用于控制對(duì)公共資源或者臨界區(qū)域訪問(wèn)量的場(chǎng)景角雷。
- 這個(gè)示例中ktv有4個(gè)包間,來(lái)了5個(gè)人性穿。這時(shí)候就使用Semaphore來(lái)控制訪問(wèn)量了勺三。只能同時(shí)允許4個(gè)人進(jìn)入包間,第5個(gè)人只有等先進(jìn)入的4個(gè)人中有人出來(lái)時(shí)才可以進(jìn)入季二。