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

Python中使用Semaphore()进行资源控制的示例

发布时间:2023-12-24 13:36:37

Semaphore(信号量)是一种用于控制多线程对共享资源进行访问的机制。它可以控制同时访问某个资源的线程数量,限制并发访问的线程数量。在Python中,可以使用Semaphore()函数来创建一个信号量对象,并通过acquire()release()方法来获取和释放信号量。

下面是一个简单的示例,演示了如何使用Semaphore进行资源控制:

from threading import Thread, Semaphore
import time
import random

# 定义一个信号量对象,初始值为3
semaphore = Semaphore(3)

# 定义一个线程类
class MyThread(Thread):
    def __init__(self, name):
        Thread.__init__(self)
        self.name = name

    def run(self):
        # 获取信号量
        semaphore.acquire()
        print(f"{self.name}正在执行任务...")
        # 模拟任务执行的时间,随机生成一个数值
        time.sleep(random.randint(1, 5))
        print(f"{self.name}任务执行完毕")
        # 释放信号量
        semaphore.release()

# 创建5个线程并启动
threads = []
for i in range(5):
    thread = MyThread(f"Thread-{i+1}")
    threads.append(thread)
    thread.start()

# 等待所有线程执行完毕
for thread in threads:
    thread.join()

print("所有任务执行完毕")

在上面的示例中,我们创建了一个信号量对象semaphore,初始值为3,表示最多同时有3个线程可以访问共享资源。然后定义了一个线程类MyThread,在run()方法中,线程首先使用semaphore.acquire()获取信号量,表示当前线程要访问共享资源。然后进行模拟任务执行的过程,使用time.sleep()方法模拟了任务执行的时间,时间取值范围为1到5秒之间的随机数。任务执行完毕后,使用semaphore.release()释放信号量,表示当前线程释放了对共享资源的访问。

在主程序中,我们创建了5个线程,每个线程执行的任务都是通过MyThread类来完成的。然后等待所有线程执行完毕后输出"所有任务执行完毕"。

值得注意的是,当一个线程使用semaphore.acquire()获取信号量时,如果当前信号量的值为0,即没有空闲的信号量可供获取,那么该线程将被阻塞,直到有其他线程释放信号量。这样可以有效控制同时访问某个共享资源的线程数量。