1 锁使用场景
compute 服务使用协程锁
@utils.synchronized(instance['uuid'])
def _sync_refresh():
xxxxxxx
下载镜像,使用线程锁 external=True
@utils.synchronized(filename, external=True, lock_path=self.lock_path)
def call_if_not_exists(target, *args, **kwargs):
if not os.path.exists(target):
fetch_func(target=target, *args, **kwargs)
2 锁的类型
• 协程锁: semaphore.Semaphore() 实现
• 进程锁: Nova 在 semaphore.Semaphore() 基础之上自身实现的跨进程的文件锁
external关键字参数标示加锁类型。
3 锁原理
3.1 进程锁
python 中给文件加锁——fcntl模块
3.1.1 简单示例:
import fcntl
锁的时机:
打开一个文件
f = open('./test') ##当前目录下test文件要先存在,如果不存在会报错。
加锁:
fcntl.flock(f,fcntl.LOCK_