python中的进程锁与线程锁
在Python中,线程和进程使用锁的机制有所不同,需分别通过threading
和multiprocessing
模块实现。以下是具体用法及注意事项:
一、线程锁(Thread Lock)
- 基本用法
线程锁用于多线程环境下保护共享资源,防止数据竞争。核心类是threading.Lock
,通过acquire()
和release()
方法控制锁的获取与释放,或使用上下文管理器简化操作。
import threadinglock = threading.Lock()
shared_data = 0def increment():global shared_datawith lock: # 自动管理锁的获取和释放shared_data += 1# 创建多个线程
threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads:t.start()
for t in threads:t.join()
print(shared_data) # 输出结果为10
- 高级锁类型
• 可重入锁(RLock):允许同一线程多次获取锁,避免死锁,适用于递归场景。
rlock = threading.RLock()
with rlock:# 可嵌套获取同一锁with rlock:# 执行操作
• 信号量(Semaphore):限制并发线程数,例如控制数据库连接池的最大连接数。
sem = threading.BoundedSemaphore(3) # 最多允许3个线程同时运行
with sem:# 访问资源
- 注意事项
• 避免死锁:确保锁的获取顺序一致,使用try...finally
或with
语句保证锁释放。
• 减少锁持有时间:仅对共享资源操作加锁,避免长时间阻塞其他线程。
二、进程锁(Process Lock)
- 基本用法
进程锁通过multiprocessing.Lock
实现,用法与线程锁类似,但需配合进程间共享内存(如multiprocessing.Value
)。
import multiprocessinglock = multiprocessing.Lock()
shared_counter = multiprocessing.Value('i', 0)def increment(counter, lock):for _ in range(1000):with lock:counter.value += 1# 创建进程
processes = [multiprocessing.Process(target=increment, args=(shared_counter, lock)) for _ in range(4)]
for p in processes:p.start()
for p in processes:p.join()
print(shared_counter.value) # 输出4000
- 进程锁与线程锁的区别
• 作用范围:线程锁仅在同一进程的线程间生效,进程锁用于跨进程同步。
• 共享资源管理:进程间共享数据需使用multiprocessing
模块的特殊数据结构(如Value
、Array
)。