Python中Semaphore()实现线程同步的高级方法解析
在Python中,Semaphore(信号量)是一种用于控制并发线程数的同步原语。它可以限制同时执行的线程数量,从而实现线程之间的同步。
Semaphore 实例化时需要传入一个整数作为参数,该参数表示可以同时获得信号量的线程数量。当一个线程获得信号量时,该信号量会减一,当一个线程释放信号量时,该信号量会加一。
Semaphore 的主要方法有两个:
- acquire(): 获得信号量,如果信号量为0,则阻塞线程等待直到信号量大于0。
- release(): 释放信号量,信号量加一。
Semaphore 在实际应用中常用于以下几种情况:
1. 控制并发线程数:通过 Semaphore 可以控制同时运行的线程数量,避免线程过多造成的系统资源消耗问题。
2. 实现线程同步:Semaphore 可以用于实现线程的同步,确保线程按照特定的顺序执行。
下面是一个使用 Semaphore 的例子,展示了如何控制并发线程数量和实现线程同步。
import threading
import time
# 创建 Semaphore 对象,设置初始信号量为2
semaphore = threading.Semaphore(2)
# 定义一个线程类,用于模拟任务的执行
class MyThread(threading.Thread):
def run(self):
# 打印当前线程名称
print(f"{self.getName()} is waiting...")
# 获得信号量
semaphore.acquire()
print(f"{self.getName()} is running...")
# 模拟任务执行时间
time.sleep(2)
# 释放信号量
semaphore.release()
print(f"{self.getName()} is done.")
# 创建5个线程,并启动
for i in range(5):
thread = MyThread()
thread.start()
# 主线程等待子线程执行完毕
for thread in threading.enumerate():
if thread is not threading.current_thread():
thread.join()
print("All threads are done.")
在上面的例子中,在主线程中创建了一个 Semaphore 对象,初始信号量为2,即最多允许2个线程同时执行。
然后定义了一个 MyThread 类,继承自 threading.Thread 类,模拟了一个任务的执行过程。在 run 方法中,首先打印当前线程的名称,然后调用 acquire 方法获得信号量,表示线程要开始执行任务。
由于初始信号量为2,所以前两个线程可以立即获得信号量,开始执行任务,而后续的线程需要等待前面的线程释放信号量才能继续执行。
任务执行过程中,通过 time.sleep(2) 模拟了一个耗时任务。任务执行完毕后,调用 release 方法释放信号量。
在主线程中,通过循环遍历 threading.enumerate() 函数返回的所有线程,调用 join 方法等待所有子线程执行完毕。最后打印出 "All threads are done." 表示所有线程执行完毕。
通过运行上述代码,可以观察到最多只有两个线程同时执行任务,而后续的线程需要等待前面的线程释放信号量后才能继续执行,从而实现了线程的同步和并发控制。
