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的Django框架中设置日期和字段可选的方法
Jul 17 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
在CentOS7下安装Python3教程解析
Jul 09 Python
8种常用的Python工具
Aug 05 Python
python3字符串输出常见面试题总结
Dec 01 Python
Python基础之字符串格式化详解
Apr 21 Python
Python关于OS文件目录处理的实例分享
May 23 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
PHP安全配置详细说明
2011/09/26 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
Angularjs中ng-repeat的简单实例
2017/08/25 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
pyspark 随机森林的实现
2020/04/24 Python
什么是python的自省
2020/06/21 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
安全保证书格式
2015/02/28 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
python关于集合的知识案例详解
2021/05/30 Python
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
日本十大血腥动漫,那些被禁播的动漫盘点
2022/03/21 日漫