python如何使用Redis构建分布式锁


Posted in Python onJanuary 16, 2020

这篇文章主要介绍了python如何使用Redis构建分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在实际应用场景中,我们可能有多个worker,可能在一台机器,也可能分布在不同的机器,但只有一个worker可以同时持有一把锁,这个时候我们就需要用到分布式锁了。

这里推荐python的实现库,Redlock-py (Python 实现).

正常情况下,worker获得锁后,处理自己的任务,完成后自动释放持有的锁,是不是感觉有点熟悉,很容易想到我们的上下文管理器,这里我们简单的用装饰器实现 with...as... 语法。

安装Redlock-py

$ pip install redlock-py

使用python自带的 contextmanager 装饰器试下上下文管理

from contextlib import contextmanager
from redlock import Redlock

@contextmanager
def worker_lock_manager(key, ttl, **kwargs):
  """
  分布式锁
  :param key: 分布式锁ID
  :param ttl: 分布式锁生存时间
  :param kwargs: 可选参数字典
  :return: None
  """
  redis_servers = [{
    'host': '127.0.0.1',
    'port': 6379,
    'db': 0,
    'password': 'pwd'
  }]

  rlk= Redlock(redis_servers)

  # 获取锁
  lock = rlk.lock(key, ttl)
 
  yield lock

  # 释放锁
  rlk.unlock(lock)

如何使用呢

with worker_lock_manager('unique_key', 1000) as w_lock:
    if w_lock is False:
        return
    do_something()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中__call__用法实例
Aug 29 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
简述Python中的面向对象编程的概念
Apr 27 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
python中for用来遍历range函数的方法
Jun 08 Python
Python常见内置高效率函数用法示例
Jul 31 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
python命令行工具Click快速掌握
Jul 04 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
python实现用户名密码校验
Mar 18 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
Python中url标签使用知识点总结
Jan 16 #Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 #Python
pytorch方法测试——激活函数(ReLU)详解
Jan 15 #Python
pytorch的batch normalize使用详解
Jan 15 #Python
pytorch方法测试详解——归一化(BatchNorm2d)
Jan 15 #Python
Python 中@property的用法详解
Jan 15 #Python
Python字符串中删除特定字符的方法
Jan 15 #Python
You might like
Banner程序
2006/10/09 PHP
JS实现php的伪分页
2008/05/25 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
angularjs+bootstrap实现自定义分页的实例代码
2017/06/19 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
python调用新浪微博API项目实践
2014/07/28 Python
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
python实现桌面壁纸切换功能
2019/01/21 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
Linux如何压缩可执行文件
2014/03/27 面试题
大学生关于奋斗的演讲稿
2014/01/09 职场文书
植树节活动总结
2014/04/30 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
运动员入场词
2015/07/18 职场文书