欢迎访问宙启技术站
智能推送

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个线程释放许可后才能继续执行。