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实现得到一个给定类的虚函数
Sep 28 Python
更改Python命令行交互提示符的方法
Jan 14 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
PyQt5实现拖放功能
Apr 25 Python
Python 16进制与中文相互转换的实现方法
Jul 09 Python
浅谈django orm 优化
Aug 18 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
浅谈Python的list中的选取范围
Nov 12 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
Python读取图像并显示灰度图的实现
Dec 01 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
使用 php4 加速 web 传输
2006/10/09 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
php的字符串用法小结
2010/06/08 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
Python线性回归实战分析
2018/02/01 Python
python如何读写json数据
2018/03/21 Python
python实现二维插值的三维显示
2018/12/17 Python
Python如何实现动态数组
2019/11/02 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
Python插件机制实现详解
2020/05/04 Python
Opencv求取连通区域重心实例
2020/06/04 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
应聘自荐信
2013/12/14 职场文书
2015年教师国培感言
2015/08/01 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
python常见的占位符总结及用法
2021/07/02 Python
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫
讲解Python实例练习逆序输出字符串
2022/05/06 Python