在Python中,信号量(Semaphore)主要用来控制多个线程或进程对共享资源的访问。信号量本质上是一种计数器,它维护一个许可(permit)数量,每次 acquire() 函数被调用时,如果还有剩余的许可,则减少一个,并允许执行;如果没有剩余许可,则阻塞当前线程直到其他线程释放信号量。
以下是一个简单的 Python 信号量 threading.Semaphore 使用示例:
import threading
# 初始化一个信号量,设置最大并发数为3
semaphore = threading.Semaphore(3)
def worker(id):
# 尝试获取信号量,如果信号量的值大于0,则获取并减1,否则阻塞等待
semaphore.acquire()
try:
print(f"Worker {id} 开始执行任务...")
# 这里代表进行某种可能需要互斥访问的资源操作
# 模拟耗时操作
time.sleep(2)
print(f"Worker {id} 完成任务.")
finally:
# 在finally块中确保无论发生什么情况都会释放信号量
semaphore.release()
# 创建5个线程来模拟同时请求资源
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
t.start()
# 确保所有线程都执行完毕
for t in threading.enumerate():
if t is not threading.currentThread():
t.join()
print("所有工作完成")
在这个例子中,我们创建了一个最多允许3个线程同时执行的信号量。当超过3个线程尝试进入临界区时,其余线程将等待信号量被释放。每个成功获取信号量的线程在完成其工作后会释放信号量,以便其他等待的线程能够继续执行。这样就实现了对有限资源的并发访问控制。