Python 信号量

2024 年 8 月 29 日 | 4 分钟阅读

在接下来的教程中,我们将通过 Python 中的 Semaphore 来理解多线程同步。

让我们开始了解 Python Semaphore。

理解 Semaphore

  1. Semaphore 是一种同步机制。
  2. Semaphore 为线程提供了对有限数量资源的同步访问。
  3. Semaphore 可以被视为一个变量,它反映了当前可用资源的数量。例如,购物中心停车场的一层有几个可用车位,这就是一个 Semaphore。
  4. Semaphore 的值不能小于零,也不能大于可用资源的 মোট 数量。
  5. Semaphore 关联两个操作 - **acquire** 和 **release**。
  6. 当一个资源通过 Semaphore 同步后被线程“**acquired**”时,Semaphore 的值会减一。
  7. 当一个资源通过 Semaphore 同步后被线程“**release**”时,Semaphore 的值会加一。
  8. Semaphore 的概念是由荷兰计算机科学家 **Edsger Dijkstra** 提出的。
  9. Dijkstra 将 Semaphore 的两个操作,即 **acquire** 和 **release**,分别表示为 **p** 和 **v**,其中 **p** 和 **v** 是荷兰语单词 **proberen** 和 **vehogen** 的首字母。
  10. 在荷兰语中,**proberen** 表示“**测试**”,而 **vehogen** 表示“**增加**”。

现在让我们了解 Python 编程语言中的 Semaphore。

理解 Python Semaphore

  1. Python 中实现 Semaphore 概念的是 **threading** 模块的一个类,该类称为 **Semaphore**。
  2. Semaphore 类包含一个构造函数,以及 **acquire()** 和 **release()** 两个方法。
  3. **acquire()** 方法用于在计数大于零时递减 Semaphore 的计数。否则,它会阻塞直到计数大于零。
  4. **release()** 方法用于增加 Semaphore 的计数并唤醒一个正在等待该 Semaphore 的线程。

让我们来看下面的语法来创建一个 Semaphore 对象。

语法

说明

在上述语法中,**object_name** 是 **Semaphore** 类的对象。Semaphore 类的 **'count'** 参数是允许同时访问的线程数。此参数的默认值为 1。

当一个线程执行 **acquire()** 方法时,"**count**" 参数的值将减一。当一个线程执行 **release()** 方法时,"**count**" 参数的值将加一。这个陈述意味着当我们调用 **acquire()** 方法时,“**count**”参数的值将减小,而在调用 **release()** 方法时,“**count**”参数的值将增加。

创建 Semaphore 对象的方法

**情况 1:** 在以下情况下,我们在创建对象时未在 Semaphore 类中指定参数。因此,count 变量的值为 1,这使得只有一个线程被允许访问。这种情况与 **Lock** 的概念完全相同。

其语法如下所示

语法

**情况 2:** 在以下情况下,'**n**' 个线程可以同时访问 Semaphore 类的一个对象。其余线程必须等待直到释放 Semaphore。

其语法如下所示

语法

让我们来看下面的示例来充分理解这个概念。

示例

输出

Javatpoint, Javatpoint, Javatpoint, Javatpoint, Thread 1
Thread 3
Thread 4
Thread 2
Javatpoint, Javatpoint, Javatpoint, Javatpoint, Javatpoint, Javatpoint, Thread 1
Thread 5
Javatpoint, Javatpoint, Thread 6
Thread 3
Thread 4
Javatpoint, Javatpoint, Thread 2
Javatpoint, Javatpoint, Thread 5
Javatpoint, Thread 1
Javatpoint, Thread 3
Javatpoint, Thread 6
Thread 2
Thread 4
Javatpoint, Javatpoint, Javatpoint, Thread 5
Javatpoint, Thread 1
Javatpoint, Thread 3
Javatpoint, Thread 6
Thread 2
Javatpoint, Javatpoint, Thread 4
Javatpoint, Thread 5
Javatpoint, Thread 1
Thread 3
Javatpoint, Javatpoint, Thread 2
Thread 6
Javatpoint, Javatpoint, Thread 4
Javatpoint, Thread 5
Javatpoint, Thread 1
Thread 3
Thread 2
Thread 6
Javatpoint, Thread 4
Thread 5
Thread 6

说明

在上面的代码片段中,我们导入了所需的模块,并使用 4 的计数创建了一个 **Semaphore** 类的对象。然后,我们使用 **acquire()** 方法定义了一个函数。然后,我们使用 **for-loop** 将值迭代到 6。然后,我们调用了 **release()** 方法并创建了多个线程。最后,我们使用 **start()** 方法调用了这些线程。


下一个主题Python sorted reverse