Python线程同步:Semaphore/Event/Condition/Barrier
请解释threading模块中Semaphore、Event、Condition和Barrier四种同步原语的作用、使用场景和底层机制。给出每个原语的实际代码示例。什么时候使用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个线程
# 并行处理第二阶段
用于分阶段并行计算(如数据加载→处理→聚合)。