返回

同步条件的必要性

见解分享

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()