一、简述
信号量Semaphore是一个计数器,控制对公共资源或者临界区域的访问量,信号量可以指定同时访问资源或者进入临界区域的进程数。每次有一个进程获得信号量时,计数器-1,若计数器为0时,其他进程就停止访问信号量,一直阻塞直到其他进程释放信号量。
二、常用方法和属性
- acquire(blocking = True, timeout=None)
- 请求一个信号量
- release()
- 释放一个信号量
三、示例
import time, random
from multiprocessing import Process, Semaphore
def ktv(i, sem):
sem.acquire()
print('%s 走进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()
运行结果
0 走进ktv
3 走进ktv
4 走进ktv
1 走进ktv
1 走出ktv
2 走进ktv
2 走出ktv
0 走出ktv
3 走出ktv
4 走出ktv
Process finished with exit code 0
示例说明:
- Semaphore 主要用于控制对公共资源或者临界区域访问量的场景。
- 这个示例中ktv有4个包间,来了5个人。这时候就使用Semaphore来控制访问量了。只能同时允许4个人进入包间,第5个人只有等先进入的4个人中有人出来时才可以进入。