在Python中,通过线程同步机制可以让其他线程等待,常见方法包括锁(Lock)实现资源独占、事件(Event)触发等待与唤醒、条件变量(Condition)处理复杂条件判断以及屏障(Barrier)控制多线程阶段性同步。这些方法能有效协调线程执行顺序,避免资源竞争和数据不一致问题。
-
互斥锁(Lock)实现线程阻塞
通过plaintext复制创建锁对象,线程在访问共享资源前调用threading.Lock()
plaintext复制获取锁,若锁已被占用则进入阻塞等待状态;使用完毕后调用acquire()
plaintext复制释放锁。例如:release()
python复制import threading lock = threading.Lock() def thread_func(): lock.acquire() # 操作共享资源 lock.release()
适用于资源独占场景(如文件读写、全局变量修改),但需注意避免死锁(如多个锁嵌套未释放)。
-
事件(Event)机制控制线程启停
使用plaintext复制创建事件对象,通过threading.Event()
plaintext复制使线程等待,其他线程调用wait()
plaintext复制触发事件后唤醒等待线程。典型应用包括多线程协作任务:set()
python复制event = threading.Event() def worker(): event.wait() # 等待事件触发 # 执行后续操作 def trigger(): # 完成前置条件后触发 event.set()
适用于异步任务协调,如主线程初始化后通知子线程启动。
-
条件变量(Condition)处理复杂等待逻辑
条件变量结合锁和等待/通知机制,通过plaintext复制挂起线程,wait()
plaintext复制或notify()
plaintext复制唤醒线程。适合生产者-消费者模型等场景:notify_all()
python复制condition = threading.Condition() def producer(): with condition: # 生产资源 condition.notify() # 唤醒消费者 def consumer(): with condition: while not resource_ready: condition.wait() # 等待资源就绪 # 消费资源
支持多条件判断,能减少无效轮询带来的性能损耗。
-
屏障(Barrier)同步多线程阶段任务
屏障通过plaintext复制设置等待线程数,所有线程到达屏障点后同时继续执行。适用于分阶段并行计算:threading.Barrier(n)
python复制barrier = threading.Barrier(3) # 需3个线程到达 def task(): # 第一阶段处理 barrier.wait() # 等待其他线程 # 第二阶段处理
确保多线程任务步调一致,如分布式数据处理的分片同步。
合理选择线程等待机制需结合具体场景:锁适用于简单互斥,事件适合单向通知,条件变量处理动态条件,屏障用于多线程协同。开发中需注意避免过度等待导致性能下降,并通过日志或超时参数(如
wait(timeout=5)
threading
Semaphore
Timer