在多线程编程中,协调不同线程安全访问共享资源至关重要。Python 中的信号量是一种同步机制,允许开发人员管理对共享资源的并发访问。

Python 中的信号量:协调并发Python 中的信号量:协调并发


什么是信号量?

信号量是一个计数器,它表示共享资源的可用性。每个信号量都有一个初始值,表示资源可用时可以获取的次数。

线程可以获取信号量,这会减少其计数器。当计数器为零时,后续线程将被阻止,直到其他线程释放信号量。

信号量的用途

信号量广泛用于协调共享资源的并发访问,例如:

管理数据库连接池 限制对有限资源(如文件)的并发访问 防止多个线程同时修改同一数据结构

Python 中的信号量

Python 提供了一个 `threading.Semaphore` 类来管理信号量。创建信号量时,可以使用 `value` 参数指定其初始值。

获取信号量

```python sema = threading.Semaphore(3) 创建一个初始值为 3 的信号量

sema.acquire() 获取信号量,将其计数器减 1 ```

释放信号量

```python sema.release() 释放信号量,将其计数器加 1 ```

示例

考虑一个有多个线程访问共享数据库连接池的示例。为了防止多个线程同时使用同一连接,可以使用信号量来协调访问。

```python import threading

创建一个数据库连接池 connections = []

def get_connection(): 获取信号量 sema.acquire()

从池中获取连接 connection = connections.pop(0)

释放信号量 sema.release()

return connection

创建一个信号量来管理连接池的访问 sema = threading.Semaphore(len(connections))

创建多个线程来获取和释放连接 threads = [] for i in range(10): thread = threading.Thread(target=lambda: get_connection()) threads.append(thread) thread.start()

等待所有线程完成 for thread in threads: thread.join() ```

结论