python-- 信号量 Semphore、事件 Event

信号量 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()