使用Semaphore()实现Python中的线程同步
发布时间:2024-01-11 13:39:30
在Python中,可以使用Semaphore()来实现线程同步。Semaphore是一个计数器,用于控制并发访问资源的数量。它管理一个内部计数器,每当调用acquire()方法时,计数器减一;每当调用release()方法时,计数器加一。当计数器为0时,acquire()方法会阻塞,直到有一个线程调用release()方法释放资源。
下面是一个使用Semaphore()实现线程同步的例子:
import threading
# 创建一个Semaphore对象,并设置初始计数为3
semaphore = threading.Semaphore(3)
def worker():
# 请求获取资源
semaphore.acquire()
print(f"{threading.currentThread().getName()}进入临界区")
# 执行临界区代码
print(f"{threading.currentThread().getName()}执行临界区代码")
# 释放资源
semaphore.release()
print(f"{threading.currentThread().getName()}离开临界区")
# 创建5个线程
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
# 启动线程
for t in threads:
t.start()
# 等待线程结束
for t in threads:
t.join()
在上述例子中,我们创建了一个Semaphore对象并将初始计数设置为3。然后创建了5个线程,每个线程都执行worker()函数。在worker()函数中,首先使用semaphore.acquire()请求获取资源,在进入临界区之前会检查计数器的值,如果计数器为0,则会阻塞等待其他线程释放资源。然后在临界区内执行临界区代码,并最终通过semaphore.release()释放资源。
通过运行上述代码,我们能够观察到只有3个线程同时进入临界区,其余线程会被阻塞等待。这样就实现了线程同步。
总结起来,使用Semaphore()实现线程同步能够控制并发访问资源的数量,有效避免了竞争条件的出现。
