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

Python中Semaphore()实现线程同步的高级方法解析

发布时间:2023-12-24 13:25:20

在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." 表示所有线程执行完毕。

通过运行上述代码,可以观察到最多只有两个线程同时执行任务,而后续的线程需要等待前面的线程释放信号量后才能继续执行,从而实现了线程的同步和并发控制。