
复制1. import time            2. import uuid               3. from redis import StrictRedis,程序 ConnectionPool               4. import threading               5.                6. class CollectRedis:               7.     # 创建redis操作类                8.     def __init__(self):               9.         self.host = "1.1.1.1"            10.         self.port = 6379               11.         self.db = 5               12.               13.     @property               14.     def redis_session(self):               15.         _session = getattr(self, "__redis_session", None)               16.         if _session:               17.             return _session               18.         redis_pool = ConnectionPool(host=self.host, port=self.port, db=self.db)               19.         _session = StrictRedis(connection_pool=redis_pool)               20.         setattr(self, "__redis_session", _session)               21.         return _session               22.                    23.     # 获取锁               24.     def get_lock(self, lock_key):               25.         return self.redis_session.get(lock_key)               26.                    27.     # 设置锁                28.     def set_lock(self, lock_key, value, timeout=300):               29.         session = self.redis_session               30.         tag = session.setnx(lock_key, value)               31.         # 如果key能创建成功则为该key设置一个超时时间,这个相当于锁的
云服务器提供商员必
有效时间               32.         # 如果没有超时时间则会导致程序死锁               33.         if tag:               34.             session.expire(lock_key, timeout)               35.         return tag               36.                    37.     # 删除锁也就是
WordPress模板释放锁               38.     def delete_lock(self, lock_key):               39.         return self.redis_session.delete(lock_key)               40.                41. # 获取锁资源方法               42. def acquire_lock(lock_name, time_out=300):               43.     identifier = str(uuid.uuid4())               44.     end = time.time() + time_out + 30               45.     redis_connect = CollectRedis()               46.     # 如果不能获取锁资源则线程一直挂起直到获取锁资源或者超时               47.     while time.time() < end:               48.         if redis_connect.set_lock(lock_name, identifier, timeout=time_out):               49.             return identifier               50.         time.sleep(0.01)               51.     returnFalse            52.                53. # 释放锁资源               54. def release_lock(lock_name, identifier):               55.     redis_connect = CollectRedis()               56.     value = redis_connect.get_lock(lock_name)               57.     if not value:               58.         returnTrue            59.     if value == identifier:               60.         redis_connect.delete_lock(lock_name)               61.         returnTrue            62.     returnFalse            63.                64.                65. def resource_lock(lock_name, timeout=10):               66.     """              67.     并发锁装饰器函数              68.     :param lock_name:              69.     :param timeout:              70.     :return:              71.     """               72.     def _outfunc(func):               73.         def inner_func(*args, **kwargs):               74.             identifier = acquire_lock(lock_name, time_out=timeout)               75.             if not identifier:               76.                 raise Exception("获取({})锁资源失败".format(lock_name))               77.             try:               78.                 result = func(*args, **kwargs)               79.                 release_lock(lock_name, identifier)               80.             except Exception as e:               81.                 # 程序出现异常时主动释放锁资源               82.                 release_lock(lock_name, identifier)               83.                 raise Exception(e.args)               84.             return result               85.         return inner_func               86.     return _outfunc               1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.
服务器租用