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同时给两个收件人发送邮件的方法
Apr 30 Python
Python自动扫雷实现方法
Jul 25 Python
python中退出多层循环的方法
Nov 27 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
解决pycharm remote deployment 配置的问题
Jun 27 Python
django框架模型层功能、组成与用法分析
Jul 30 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 Python
Python制作表白爱心合集
Jan 22 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
PHP,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
javascript的this关键字详解
2019/05/20 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
python实现简单温度转换的方法
2015/03/13 Python
批处理与python代码混合编程的方法
2016/05/19 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
python ---lambda匿名函数介绍
2019/03/13 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
Python 支持向量机分类器的实现
2020/01/15 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
法院先进个人事迹材料
2014/05/04 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
小学运动会加油稿
2015/07/22 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
Pytorch 如何实现常用正则化
2021/05/27 Python
python库sklearn常用操作
2021/08/23 Python