比使用网络上的.lock文件更好的“互斥”方法是使用分布式锁。分布式锁是一种可以在分布式系统中协调多个进程或线程之间的互斥访问共享资源的机制。
下面是一个使用Redis作为分布式锁的示例代码:
import redis
import time
import uuid
class DistributedLock:
def __init__(self, host, port, lock_key, timeout=10):
self.redis = redis.Redis(host=host, port=port)
self.lock_key = lock_key
self.timeout = timeout
def acquire_lock(self):
lock_id = str(uuid.uuid4())
end_time = time.time() + self.timeout
while time.time() < end_time:
if self.redis.setnx(self.lock_key, lock_id):
return lock_id
time.sleep(0.1)
return None
def release_lock(self, lock_id):
current_lock_id = self.redis.get(self.lock_key)
if current_lock_id and current_lock_id.decode() == lock_id:
self.redis.delete(self.lock_key)
return True
return False
# 使用示例
lock = DistributedLock('localhost', 6379, 'my_lock')
# 尝试获取锁
lock_id = lock.acquire_lock()
if lock_id:
try:
# 在锁内执行需要互斥访问的代码
print("执行互斥访问的代码")
finally:
# 释放锁
lock.release_lock(lock_id)
else:
print("获取锁失败")
在这个示例中,我们使用Redis作为分布式锁的存储介质,通过setnx
命令尝试获取锁。如果获取成功,则执行需要互斥访问的代码块;如果获取失败,则等待一段时间后再次尝试获取锁。
在执行完需要互斥访问的代码块后,我们使用release_lock
方法来释放锁。在释放锁之前,会先检查当前锁是否属于当前进程,以防止其他进程意外释放锁。
使用分布式锁可以更好地实现互斥访问,避免了使用.lock文件的问题,例如网络延迟、文件冲突等。