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开发实例分享bt种子爬虫程序和种子解析
May 21 Python
python实现将元祖转换成数组的方法
May 04 Python
Python实现LRU算法的2种方法
Jun 24 Python
详解Django中的过滤器
Jul 16 Python
Python中Class类用法实例分析
Nov 12 Python
pycharm 解除默认unittest模式的方法
Nov 30 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
python小白切忌乱用表达式
May 29 Python
python怎么调用自己的函数
Jul 01 Python
Django封装交互接口代码
Jul 12 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 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后门
2015/09/13 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
php使用正则验证中文
2016/04/06 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
判断用户是否在线的代码
2011/03/05 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
中专生职业生涯规划书范文
2013/12/29 职场文书
个人整改措施书面材料
2014/10/24 职场文书
邹越演讲观后感
2015/06/15 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
JavaScript实现登录窗体
2021/06/22 Javascript
DE1107机评
2022/04/05 无线电
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android