返回
同步条件的必要性
见解分享
2023-11-03 17:41:17
Python 多线程同步条件:Event、信号量和队列
在 Python 多线程环境中,当多个线程同时访问共享资源时,可能会出现数据竞争和不可预测的行为。为了解决这个问题,需要引入同步条件,它们允许线程协调其活动并确保数据的完整性。
事件(Event)
Event 是一个同步原语,用于通知一个或多个等待的线程某个事件已经发生。它是一个二进制标志,最初设置为 False,当事件发生时,它会被置为 True。等待线程可以通过调用 wait() 方法阻塞,直到事件被置为 True。
import threading
event = threading.Event()
def worker():
# 等待事件发生
event.wait()
# 事件发生后执行的任务
print("事件已发生")
# 启动工作线程
worker_thread = threading.Thread(target=worker)
worker_thread.start()
# 置事件为 True,通知等待线程
event.set()
信号量(Semaphore)
信号量是一种同步原语,用于限制对共享资源的并发访问。它有一个计数器,表示资源的可用数量。线程可以通过调用 acquire() 方法获取一个资源,如果资源不可用,线程将被阻塞。释放资源时,调用 release() 方法增加计数器。
import threading
# 创建一个限制并发访问资源数量为 3 的信号量
semaphore = threading.Semaphore(3)
def worker():
# 获取一个资源
semaphore.acquire()
# 使用资源
print("获取资源成功")
# 释放资源
semaphore.release()
# 启动工作线程
for i in range(10):
worker_thread = threading.Thread(target=worker)
worker_thread.start()
队列(Queue)
队列是一种同步数据结构,用于在多个线程之间传递数据。它遵循先进先出的(FIFO)原则。线程可以通过调用 put() 方法向队列添加元素,并通过调用 get() 方法从队列中获取元素。
import queue
# 创建一个队列
queue = queue.Queue()
def producer():
# 向队列添加元素
queue.put("元素 1")
queue.put("元素 2")
def consumer():
# 从队列获取元素
print(queue.get())
print(queue.get())
# 启动生产者和消费者线程
producer_thread = threading.Thread(target=producer)
producer_thread.start()
consumer_thread = threading.Thread(target=consumer)
consumer_thread.start()