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

Python中使用Semaphore()实现线程安全的机制

发布时间:2023-12-24 13:24:04

Python中通过使用Semaphore来实现线程安全的机制,Semaphore是一个非负整数计数器,用于控制对共享资源的访问。它用于保护临界区,以确保同时只有一个线程可以访问共享资源。

Semaphore在创建时需要指定一个初始值,表示可用资源的数量。当一个线程需要访问共享资源时,它首先尝试获得一个许可证,如果许可证数量大于0,线程可以继续执行,并将许可证数量减少1;如果许可证数量为0,线程将被阻塞,直到有其他线程释放许可证。

接下来我们以一个示例来说明Semaphore的使用方法。假设有一个任务需要由多个线程并发执行,但是限制同时只能有3个线程执行任务,其他线程需要等待。我们可以使用Semaphore来实现这个机制。

首先,我们需要导入threading模块和time模块:

import threading
import time

然后创建一个Semaphore对象,并指定初始值为3:

semaphore = threading.Semaphore(3)

接下来,我们定义一个任务函数,模拟执行某个任务的过程。在任务函数中,首先我们尝试获取一个许可证,如果获取不到将被阻塞。一旦获取到许可证,我们将执行任务,并在完成后释放许可证。

def task():
    # 尝试获取许可证
    semaphore.acquire()
    
    # 执行任务
    print("Thread %s is running" % threading.current_thread().name)
    time.sleep(2)
    print("Thread %s is done" % threading.current_thread().name)
    
    # 释放许可证
    semaphore.release()

然后我们创建多个线程来执行任务。每个线程在执行任务之前都会尝试获取一个许可证,如果没有可用的许可证,则会被阻塞。

threads = []
for i in range(10):
    t = threading.Thread(target=task)
    threads.append(t)
    t.start()

最后,我们需要等待所有线程执行完毕。

for t in threads:
    t.join()

完整的示例代码如下:

import threading
import time

semaphore = threading.Semaphore(3)

def task():
    semaphore.acquire()
    print("Thread %s is running" % threading.current_thread().name)
    time.sleep(2)
    print("Thread %s is done" % threading.current_thread().name)
    semaphore.release()

threads = []
for i in range(10):
    t = threading.Thread(target=task)
    threads.append(t)
    t.start()

for t in threads:
    t.join()

运行上述代码,我们会看到只有3个线程同时执行任务,其他线程会在获取许可证时被阻塞。

这就是使用Semaphore在Python中实现线程安全的机制的方法和示例。Semaphore可以用于控制对共享资源的访问,以保证同时只有有限数量的线程可以访问共享资源,从而避免了线程之间的竞争条件。