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

Semaphore():Python中用于控制并发访问的强大工具

发布时间:2024-01-11 13:39:57

Python中的Semaphore是一个用于控制并发访问的强大工具。它是一个计数器,用于表示可同时访问特定资源的线程数。

Semaphore有两个主要方法:acquire()和release()。

acquire()方法用于获取一个信号量。 如果该信号量的计数器大于零,则将其减一并返回。 如果计数器为零,则acquire()方法将阻塞线程,直到计数器大于零为止。

release()方法用于释放一个信号量。 该方法将计数器加一。 如果有其他线程正等待该信号量,则其中一个线程将被唤醒继续执行。

Semaphore的一个常见应用是用于限制并发线程的数量。 下面是一个使用Semaphore限制并发线程数的例子:

import threading

def worker(semaphore):
    # 获取信号量
    semaphore.acquire()
    print('Worker starting')

    # 模拟工作
    for i in range(5):
        print('Working...')
    
    print('Worker finished')
    
    # 释放信号量
    semaphore.release()

def main():
    # 创建一个Semaphore对象,并传入初始值
    semaphore = threading.Semaphore(2)
    
    # 创建多个线程并启动
    threads = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(semaphore,))
        threads.append(t)
        t.start()
    
    # 等待所有线程结束
    for t in threads:
        t.join()

if __name__ == "__main__":
    main()

在上面的例子中,我们创建了一个信号量对象,并将初始值设置为2,这意味着最多只能允许两个线程同时工作。然后,我们创建了5个线程,并将信号量对象作为参数传递给每个线程的worker()函数。

在worker()函数中,我们在开始工作之前使用acquire()方法获取一个信号量,这将阻塞第三个线程。然后,我们模拟工作,然后使用release()方法释放信号量,以允许其他等待的线程继续工作。

运行以上代码,你会发现最多只会有两个线程同时工作,当一个线程完成后,下一个等待的线程将被唤醒。

这个例子演示了Semaphore的基本用法,使用Semaphore可以有效地控制并发线程的数量,避免资源竞争和线程争用,提高程序的性能和稳定性。