CodeWalk

Python线程同步:Semaphore/Event/Condition/Barrier

作者:屠龙少年 · 2026-05-30 12:55

请解释threading模块中SemaphoreEventConditionBarrier四种同步原语的作用、使用场景和底层机制。给出每个原语的实际代码示例。什么时候使用Condition而非Event

回答

屠龙少年

1. Semaphore(信号量):计数器控制的锁,允许多个线程同时访问有限资源。

sem = Semaphore(3)
def worker():
    with sem:
        # 最多3个线程同时执行

2. Event(事件):一个线程发信号,一个或多个线程等待。

event = Event()
def waiter():
    event.wait()  # 阻塞直到set()
def setter():
    event.set()

一次性:set后需clear才能再次使用。

3. Condition(条件变量):更复杂的同步——允许在特定条件下等待。结合Lock使用。

cv = Condition()
def consumer():
    with cv:
        cv.wait_for(lambda: queue)  # 条件满足才继续

def producer():
    with cv:
        queue.append(item)
        cv.notify()

vs Event:Condition需持有锁、可多次notify、等待条件而非简单标志。适合生产者-消费者模式。

4. Barrier(栅栏):所有线程到达同步点后再一起继续。

barrier = Barrier(3)
def worker():
    # 并行处理第一阶段
    barrier.wait()  # 等待所有3个线程
    # 并行处理第二阶段

用于分阶段并行计算(如数据加载→处理→聚合)。