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

使用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()实现线程同步能够控制并发访问资源的数量,有效避免了竞争条件的出现。