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 调用VC++的动态链接库(DLL)
Sep 06 Python
java直接调用python脚本的例子
Feb 16 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
利用python写个下载teahour音频的小脚本
May 08 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
Python多线程threading模块用法实例分析
May 22 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
python找出列表中大于某个阈值的数据段示例
Nov 24 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
python怎么判断模块安装完成
Jun 19 Python
python小技巧——将变量保存在本地及读取
Nov 13 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垃圾回收机制引用计数器概念分析
2013/06/24 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
php动态函数调用方法
2015/05/21 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
php验证码实现代码(3种)
2015/09/07 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
用Python生成器实现微线程编程的教程
2015/04/13 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Python pymsql模块的使用
2020/09/07 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
放飞蜻蜓反思
2014/02/05 职场文书
大专生自荐书范文
2014/06/22 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
个人总结与自我评价2015
2015/03/11 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
浅谈Redis中的RDB快照
2021/06/29 Redis