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中的应用,它可以有效地保护共享资源免受并发访问的影响,并控制并发访问的数量,避免资源竞争和冲突。
