Python中Semaphore()的工作原理及实例
发布时间:2023-12-24 13:22:03
Semaphore(信号量)是多进程编程中的一种同步原语,用于控制对临界区资源的访问。Semaphore维护一个可用的许可数量,线程可以获取许可并使用它,当许可数量为0时,线程需要等待直到有其他线程释放许可。
Semaphore的工作原理如下:
1. 初始化Count值:通过构造函数创建Semaphore实例时,需要指定一个初始Count值,表示可用的许可数量。
2. 获取许可:线程可以调用acquire()方法来获取一个许可,如果Count大于0,则线程可以立即继续执行,并将Count减1;如果Count等于0,则线程需要等待直到有其他线程释放许可。
3. 释放许可:线程可以调用release()方法来释放一个许可,让其他等待的线程可以继续执行。释放许可会将Count加1。
4. 计算Count值:Semaphore还提供了一个获取当前Count值的方法get_value()。
下面是一个使用Semaphore的例子,假设有5个线程需要访问某个临界区资源:
from threading import Semaphore, Thread
import time
# 定义一个许可数量为2的Semaphore
semaphore = Semaphore(2)
# 定义一个共享变量
shared_value = 0
# 定义一个线程类
class MyThread(Thread):
def run(self):
global shared_value
# 获取许可
semaphore.acquire()
try:
# 访问临界区资源,这里模拟了一些耗时操作
time.sleep(1)
shared_value += 1
print("Thread %s: increment shared value to %d" % (self.name, shared_value))
finally:
# 释放许可
semaphore.release()
# 创建5个线程并启动
threads = []
for i in range(5):
thread = MyThread()
thread.start()
threads.append(thread)
# 等待所有线程执行完成
for thread in threads:
thread.join()
print("Final shared value: %d" % shared_value)
上述代码中,我们创建了一个初始许可数量为2的Semaphore,并定义了一个共享变量shared_value来模拟一个临界区资源。然后创建了5个线程,每个线程都要获取一个许可,访问临界区资源,并将shared_value加1,最后释放许可。在主线程中,我们等待所有线程执行完成,并打印出最终的shared_value的值。
运行上述代码,可以看到输出结果可能类似于以下内容:
Thread Thread-1: increment shared value to 1 Thread Thread-2: increment shared value to 2 Thread Thread-3: increment shared value to 3 Thread Thread-4: increment shared value to 4 Thread Thread-5: increment shared value to 5 Final shared value: 5
可以观察到,每次输出的shared_value值都是依次递增的,这是因为Semaphore限制了同时访问临界区资源的线程数量为2,所以每个线程需要等待前面的2个线程释放许可后才能继续执行。
