本文是一个demo,利用多进程,来模拟使用redis分布式锁的使用场景。本机须要安装redis,python3.7下运行代码。分布式锁用redlock这个包实现,实现步骤分三步:python
完整代码以下:redis
# -*- coding: utf-8 -*- import os import arrow import redis from multiprocessing import Pool from redlock.lock import RedLock HOT_KEY = 'count' r = redis.Redis(host='localhost', port=6379) def seckilling(): name = os.getpid() v = r.get(HOT_KEY) if int(v) > 0: print (name, ' decr redis.') r.decr(HOT_KEY) else: print (name, ' can not set redis.', v) # def run_without_lock(name): while True: if arrow.now().second % 5 == 0: seckilling() return rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}]) def run_with_redis_lock(name): while True: if arrow.now().second % 5 == 0: # 二,获取锁 if rlock.acquire(): seckilling() # 释放锁 rlock.release() return if __name__ == '__main__': p = Pool(80) r.set(HOT_KEY, 1) for i in range(80): # p.apply_async(run_without_lock, args=(i,)) p.apply_async(run_with_redis_lock, args=(i,)) print ('now 16 processes are going to get lock!') p.close() p.join() print('All subprocesses done.')
使用锁的代码,主要是:并发
rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}]) def run_with_redis_lock(name): while True: if arrow.now().second % 5 == 0: # 二,获取锁 if rlock.acquire(): seckilling() # 释放锁 rlock.release() return
总结,咱们使用锁的缘由,就是让并发的程序造成阻塞,并发能够引发的问题是数据不一致的状况,使用锁,造成阻塞,排队使用数据,就不会形成数据不一致的问题了,固然了,阻塞确定会下降效率了,速度要慢不少。app