Python 基於redis實現一個簡單的分佈式鎖

# redis_lock.py
import redis
import time
import threading

# 連接池方式
pool = redis.ConnectionPool(host='127.0.0.1',port=6379)
redis_con = redis.Redis(connection_pool=pool)


class RedisLock(object):
    def __init__(self):
        self.redis_con = redis_con

    def get_lock(self, val):
        while True:
            res = self.redis_con.set('lock', val,nx=True, ex=3 * 60)
            if res:
                break
            # print('繼續等待鎖...')
            time.sleep(0.1)

    def del_lock(self, val):
        old_val = redis_con.get('lock')
        if old_val == val.encode():
            self.redis_con.delete('lock')
            print('鎖釋放成功')
SUMS = 0

def test_lock(lock, name, num, val):
    try:
        print('%s 開始工作' % name)
        print('%s 準備獲取鎖並加鎖' % name)
        lock.get_lock(val)
        print('%s 得到鎖,繼續工作' % name)
        global SUMS
        SUMS += 15
        time.sleep(num)
        print(SUMS)
    except Exception as e:
        print('發生異常:%s' % str(e))
    finally:
        print('%s 操作完成,準備釋放鎖'%name)
        lock.del_lock(val)


if __name__ == '__main__':
    start_time = time.time()
    r_lock = RedisLock()
    tasks = []
    for num in range(1,4):
        t = threading.Thread(target=test_lock, args=(r_lock, '任務%d'%num,num,'lock%d'%num))
        tasks.append(t)
        t.start()
    [item.join() for item in tasks]
    print('總耗時:', time.time() - start_time)

運行效果:

$ python redis_lock.py
任務1 開始工作
任務2 開始工作
任務2 準備獲取鎖並加鎖
任務3 開始工作
任務1 準備獲取鎖並加鎖
任務3 準備獲取鎖並加鎖
任務2 得到鎖,繼續工作
15
任務2 操作完成,準備釋放鎖
鎖釋放成功
任務3 得到鎖,繼續工作
30
任務3 操作完成,準備釋放鎖
鎖釋放成功
任務1 得到鎖,繼續工作
45
任務1 操作完成,準備釋放鎖
鎖釋放成功
總耗時: 6.061553478240967
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章