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

Semaphore()在Python中的应用:保护共享资源免受并发访问的影响

发布时间:2024-01-11 13:41:01

在Python中,Semaphore(信号量)是一种用于控制并发访问共享资源的机制。它允许多个线程同时访问共享资源,但限制了同时访问的线程数量,从而防止资源竞争和冲突。

Semaphore在Python中通过threading模块来实现。下面是一个简单的示例,说明了如何使用Semaphore来保护共享资源免受并发访问的影响。

import threading
import time

# 创建Semaphore对象,并指定最大同时访问数为3
semaphore = threading.Semaphore(3)

# 共享资源
shared_resource = 0

def worker():
    global shared_resource

    # 通过acquire方法获取信号量
    # 如果已达到最大同时访问数,则线程会被阻塞
    semaphore.acquire()
    print(f'Thread {threading.current_thread().name} acquired semaphore')
    
    # 模拟共享资源的访问
    time.sleep(1)
    shared_resource += 1
    print(f'Shared resource updated by Thread {threading.current_thread().name}: {shared_resource}')
    
    # 释放信号量,允许其他线程访问共享资源
    semaphore.release()
    print(f'Thread {threading.current_thread().name} released semaphore')

# 创建5个线程来同时访问共享资源
threads = []
for i in range(5):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

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

print(f'Final value of shared resource: {shared_resource}')

上述代码中,我们创建了一个Semaphore对象,并将最大同时访问数设置为3。然后,我们定义了一个worker函数作为线程的执行函数。在worker函数中,线程会先尝试获取信号量,如果已达到最大同时访问数,则线程会被阻塞,直到有其他线程释放信号量。然后,线程会对共享资源进行访问和更新,最后释放信号量,允许其他线程访问共享资源。

我们创建了5个线程来同时访问共享资源,但由于信号量的存在,最多只有3个线程可以同时访问共享资源。通过观察输出结果,我们可以看到只有3个线程同时进行了访问和更新共享资源的操作。最终,共享资源的值为3,而不是5,这是因为最后两个线程无法同时访问共享资源,只能等待前面的线程释放信号量。

这个示例展示了Semaphore在Python中的应用,它可以有效地保护共享资源免受并发访问的影响,并控制并发访问的数量,避免资源竞争和冲突。