保证多机部署情况下, 只有一台机器上的程序在运行
import redis
import time
import threading
import uuid
class DistributedLock:
def __init__(self, lock_key, lock_timeout=10, renew_interval=5):
self.lock_key = lock_key
self.lock_timeout = lock_timeout
self.renew_interval = renew_interval
self.redis_client = redis.Redis() # <---- redis 地址
self.lock_id = None
def acquire_lock(self):
self.lock_id = uuid.uuid4().hex
while not self.redis_client.set(self.lock_key, self.lock_id, nx=True, ex=self.lock_timeout):
time.sleep(0.1)
self.start_renew_thread()
def start_renew_thread(self):
threading.Thread(target=self.renew_lock, daemon=True).start()
def renew_lock(self):
while True:
time.sleep(self.renew_interval)
if self.redis_client.get(self.lock_key) == self.lock_id.encode():
self.redis_client.expire(self.lock_key, self.lock_timeout)
def release_lock(self):
if self.redis_client.get(self.lock_key) == self.lock_id.encode():
self.redis_client.delete(self.lock_key)
# 测试示例
lock = DistributedLock('my_lock')
lock.acquire_lock()
time.sleep(20) # 模拟业务执行时间
lock.release_lock()