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之玩转字符串(2)
Sep 14 Python
Python自动扫雷实现方法
Jul 25 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
python 多个参数不为空校验方法
Feb 14 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
详解Python中namedtuple的使用
Apr 27 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
Python环境使用OpenCV检测人脸实现教程
Oct 19 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安装攻略:常见问题解答(二)
2006/10/09 PHP
PHP新手上路(八)
2006/10/09 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
php中的常用魔术方法总结
2013/08/02 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
浅谈Django的缓存机制
2018/08/23 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
Shell编程面试题
2016/05/29 面试题
公司中层干部的自我评价分享
2014/03/01 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
摘录式读书笔记
2015/07/01 职场文书
教师节座谈会主持词
2015/07/03 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技