信号量 Semaphore
信号量(Semaphore)是多线程编程中常用的同步机制之一,在Python中可以通过Semaphore类来实现。信号量主要用于控制同时访问某个资源的线程数量,它维护一个内部计数器,线程在访问资源之前需要先获取信号量,获取成功后计数器减一,释放资源后计数器加一。
创建信号量
在Python中,可以使用Semaphore()
函数来创建一个信号量对象,该函数的参数为初始值,表示同时允许的线程数量。
from threading import Semaphore
semaphore = Semaphore(5)
上述代码创建了一个初始值为5的信号量对象semaphore
,表示同时允许5个线程访问资源。
获取和释放信号量
信号量的主要操作是获取(acquire)和释放(release),通过acquire()
方法获取信号量,release()
方法释放信号量。
当调用acquire()
方法时,信号量对象的计数器减一,如果计数器大于等于0,则线程可以继续执行,否则线程将阻塞直到有其他线程释放信号量。而release()
方法则将信号量对象的计数器加一,如果有线程正在等待信号量,则其中的一个线程将被唤醒并继续执行。
semaphore.acquire()
# 临界区代码
semaphore.release()
在上述代码中,acquire()
方法被调用后,如果计数器大于等于0,则线程可以继续执行临界区代码,否则线程将被阻塞。release()
方法在临界区代码执行完毕后被调用,将信号量计数器加一,从而唤醒可能在等待信号量的线程。
使用示例
下面是一个简单的示例,通过信号量控制同时访问资源的线程数量:
import threading
semaphore = threading.Semaphore(3)
def worker():
semaphore.acquire()
print('Thread', threading.current_thread().name, 'acquired semaphore')
print('Thread', threading.current_thread().name, 'is working...')
semaphore.release()
print('Thread', threading.current_thread().name, 'released semaphore')
for i in range(5):
t = threading.Thread(target=worker)
t.start()