# 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