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

Python中Semaphore()在多线程编程中的作用

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

在Python中,Semaphore(信号量)是一种用于控制线程并发数量的同步原语。它主要用于限制同时执行的线程的数量,在多线程编程中常用来保护有限的系统资源,如数据库连接、文件句柄等。

Semaphore对象可以指定允许的最大线程数目,初始化时需要指定一个整数参数,代表可以同时运行的线程的数量。当线程要执行某个操作前,首先尝试获得Semaphore,如果已经达到最大限制,线程将被阻塞,直到有其他线程释放Semaphore。

下面是一个使用Semaphore控制线程并发数量的例子:

import threading

# 假设只允许同时运行2个线程
semaphore = threading.Semaphore(2)

def task(name):
    semaphore.acquire()
    print(f'{name}开始执行')
    # 模拟线程任务
    for i in range(5):
        print(f'{name}正在执行第{i+1}个操作')
    print(f'{name}执行完毕')
    semaphore.release()

# 创建5个线程并运行任务
threads = []
for i in range(5):
    t = threading.Thread(target=task, args=(f'线程{i+1}',))
    threads.append(t)
    t.start()

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

在上面的例子中,创建了5个线程并运行任务。由于设置了Semaphore的数量为2,所以最多只有2个线程能够同时执行任务,其他线程将被阻塞。

运行结果可能如下所示:

线程1开始执行
线程1正在执行第1个操作
线程1正在执行第2个操作
线程2开始执行
线程2正在执行第1个操作
线程2正在执行第2个操作
线程1正在执行第3个操作
线程1正在执行第4个操作
线程1正在执行第5个操作
线程1执行完毕
线程2正在执行第3个操作
线程2正在执行第4个操作
线程2正在执行第5个操作
线程2执行完毕
线程3开始执行
线程3正在执行第1个操作
线程3正在执行第2个操作
线程3正在执行第3个操作
线程3正在执行第4个操作
线程3正在执行第5个操作
线程3执行完毕
线程4开始执行
线程4正在执行第1个操作
线程4正在执行第2个操作
线程4正在执行第3个操作
线程4正在执行第4个操作
线程4正在执行第5个操作
线程4执行完毕
线程5开始执行
线程5正在执行第1个操作
线程5正在执行第2个操作
线程5正在执行第3个操作
线程5正在执行第4个操作
线程5正在执行第5个操作
线程5执行完毕

从结果可以看出,最多同时运行2个线程,其他线程被阻塞,直到有其他线程释放Semaphore。

Semaphore在多线程编程中的作用是控制并发线程的数量,从而保护有限的系统资源。它可以防止资源被过度占用和争夺,提高系统的性能和稳定性。