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

Python中使用Semaphore()实现线程同步的例子

发布时间:2023-12-24 13:22:42

在Python中,可以使用Semaphore()来实现线程同步,它是一个计数器,用来控制同时访问某个资源的线程数量。

下面是一个使用Semaphore()实现线程同步的例子:

import threading

# 创建一个信号量,初始值为1
semaphore = threading.Semaphore(1)

# 共享资源
shared_resource = 0

# 线程函数
def increment():
    global shared_resource
    
    # 等待信号量
    semaphore.acquire()
    
    # 修改共享资源
    shared_resource += 1
    
    # 释放信号量
    semaphore.release()

# 创建10个线程并启动
threads = []
for _ in range(10):
    thread = threading.Thread(target=increment)
    threads.append(thread)
    thread.start()

# 等待所有线程结束
for thread in threads:
    thread.join()

# 打印共享资源的值
print("共享资源的值:", shared_resource)

在上面的例子中,我们创建了一个信号量semaphore,初始值为1。共享资源shared_resource的初始值为0。

线程函数increment()中,首先调用semaphore.acquire()来申请信号量。如果信号量的值大于0,说明没有其他线程正在访问共享资源,线程可以继续执行。如果信号量的值为0,说明有其他线程正在访问共享资源,线程会被阻塞,直到有信号量被释放。

然后,线程在临界区内修改共享资源。这里简单地将共享资源加1。

最后,线程调用semaphore.release()来释放信号量,允许其他线程访问共享资源。

在主程序中,我们创建了10个线程并启动。然后,等待所有线程结束。最后,打印共享资源shared_resource的值,由于使用了信号量的线程同步控制,每个线程都能正确地增加shared_resource的值。

上述例子中,我们使用了初始值为1的信号量来控制对共享资源的访问。这意味着同一时间只允许一个线程访问临界区,其他线程将被阻塞。

如果我们改变信号量的初始值为2,即semaphore = threading.Semaphore(2),那么同一时间将允许两个线程访问临界区,其他线程仍将被阻塞。

在实际应用中,我们可以根据需求调整信号量的初始值,以控制对共享资源的并发访问。