Python中Semaphore()的使用方法详解
发布时间:2023-12-24 13:21:33
Semaphore(信号量)是Python中的一个同步原语,用于控制对共享资源的访问。它可以操纵一个内置的计数器,该计数器是非负整数,初始值由用户指定。每次对Semaphore对象调用acquire()方法时,计数器减1;每次对Semaphore对象调用release()方法时,计数器加1。当计数器为0时,后续的acquire()方法会被阻塞,直到有其他线程释放计数器。
Semaphore常用于限制同时访问某些资源的线程数量,它可以控制同时访问某个资源的线程数量不超过指定的上限。
下面我们通过一个例子来详细介绍Semaphore的使用方法。
import threading
# 创建一个Semaphore对象,初始计数器为3
semaphore = threading.Semaphore(3)
def func():
# 获取Semaphore对象的锁
semaphore.acquire()
print("Thread %s is running" % threading.currentThread().getName())
# 模拟耗时操作
import time
time.sleep(1)
# 释放Semaphore对象的锁
semaphore.release()
if __name__ == "__main__":
# 创建10个线程
threads = []
for i in range(10):
t = threading.Thread(target=func)
threads.append(t)
# 启动所有线程
for t in threads:
t.start()
# 等待所有线程执行完毕
for t in threads:
t.join()
上述例子中,我们创建了一个初始计数器为3的Semaphore对象,然后定义了一个函数func(),函数中使用了semaphore.acquire()获取Semaphore对象的锁,并输出当前线程的名称。在模拟的耗时操作后,我们使用semaphore.release()释放Semaphore对象的锁。
在主程序中,我们创建了10个线程并启动,每个线程都会执行func()函数。由于Semaphore对象的计数器为3,所以前三个线程可以立即获取锁并执行,而后续的线程需要等待其他线程释放锁后才能继续执行。
运行这段程序,可以观察到前三个线程同时执行,后续线程需要等待前面线程释放锁后才能执行。这样就实现了对共享资源的并发访问控制。
总结:Semaphore是Python中的一个同步原语,用于控制对共享资源的访问。它可以限制同时访问某个资源的线程数量,通过acquire()和release()方法来获取与释放锁。在多线程并发访问时,通过Semaphore对象可以很方便地实现对共享资源的访问控制。
