在Python中使用Semaphore()实现线程同步
发布时间:2023-12-24 13:36:25
在Python中,可以使用Semaphore()来实现线程同步。Semaphore是一种常见的并发控制机制,可以限制同时执行的线程数量。
Semaphore()的初始化参数是一个整数n,表示最多有n个线程可以同时执行。当一个线程调用acquire()方法时,Semaphore的计数器会减1;当一个线程调用release()方法时,Semaphore的计数器会加1。当计数器为0时,调用acquire()方法的线程会被阻塞,直到有其他线程调用release()方法释放计数器。
下面是一个使用Semaphore实现线程同步的例子。假设有10个工人正在生产商品,每个工人需要3秒钟的时间来完成一件商品。我们希望使用Semaphore来限制同时执行生产任务的工人数量为5个,即同一时间最多只能有5个工人在生产。
import threading
import time
class Worker(threading.Thread):
def __init__(self, name, semaphore):
threading.Thread.__init__(self)
self.name = name
self.semaphore = semaphore
def run(self):
print(f"{self.name} 开始生产商品")
time.sleep(3) # 模拟生产一件商品需要的时间
print(f"{self.name} 完成生产商品")
self.semaphore.release() # 释放Semaphore的计数器
def main():
num_workers = 10
max_concurrent = 5
semaphore = threading.Semaphore(max_concurrent) # 初始化Semaphore
workers = []
for i in range(num_workers):
worker = Worker(f"工人-{i+1}", semaphore)
workers.append(worker)
worker.start()
semaphore.acquire() # 获取Semaphore的计数器
for worker in workers:
worker.join()
if __name__ == "__main__":
main()
在上面的例子中,我们创建了10个工人线程,每个工人线程在运行时会先调用semaphore.acquire()获取Semaphore的计数器,当计数器为0时,线程会被阻塞。然后每个工人线程会经过3秒的睡眠后完成生产,并调用semaphore.release()释放Semaphore的计数器,给其他线程获取的机会。
由于我们通过semaphore.acquire()限制了同时执行的线程数量为5个,所以同一时间最多只能有5个工人在生产商品。其他工人需要等待有空位后才能开始生产。这样就实现了线程同步,避免了资源竞争的问题。
通过Semaphore,我们可以方便地控制并发执行的线程数量,实现线程的同步。在实际开发中,Semaphore常常用于控制对某些共享资源的访问,避免多个线程同时对资源进行修改而引发的问题。
