Python并发访问共享资源需加锁,因GIL无法保证复合操作原子性,多线程/协程同时读写会导致竞态条件、丢失更新;threading.Lock、asyncio.Lock等同步原语可保障数据一致性。
Python中并发访问共享资源时,必须通过同步机制保证数据一致性,否则极易出现竞态条件(race condition),导致结果不可预测。
多个线程或协程同时读写同一变量、列表、字典等对象时,Python的GIL仅能保证单个字节码原子性,无法覆盖复合操作(如counter += 1,实际包含读取、计算、写入三步)。若无干预,不同线程可能基于过期值计算,造成丢失更新。
权,共享对象仍可能被其他协程修改根据并发模型选择合适工具,避免过度同步影响性能。
RLock支持同一线程重复获取threading.Lock,但必须配合await使用(如async with lock:)同步机制本身不能解决所有问题,错误用法反而掩盖隐患。
立即学习“Python免费学习笔记(深入)”;
with lock:),避免异常导致锁未释放multiprocessing中全局变量不共享,需用Manager或Value/Array,其同步机制与线程不同对比有锁与无锁行为差异:
import threading import time❌ 不安全版本
counter = 0 def unsafeincrement(): global counter for in range(100000): counter += 1 # 非原子操作
✅ 安全版本
safe_counter = 0 lock = threading.Lock() def safe_increment(): global safecounter for in range(100000): with lock: safe_counter += 1
启动10个线程执行后,counter结果通常远小于1000000;而safe_counter恒为1000000。这直观体现了锁对一致性的保障作用。