python 版本分布式锁

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介:


此文章,实现python 版本的分布式锁,java版本的可以使用curator很容易实现,python版本如下


在做分布式系统开发的时候,分布式锁可以说是必需的一个组件。最近做了一些调研和尝试,经过对比,基于ZooKeeper的分布式锁还是很不错的。

 

参照了IBM的一个帖子:https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

其中有一段话描述了ZooKeeper的共享锁(即分布式锁)实现,如下:

共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。


 通过这段话,大概可以明白其原理。下面我主要写一下基于Python的分布式锁实现。

实现

Google了一下,有个叫Kazoo的python开源包很好的实现了对ZooKeeper的支持。

Kazoo is a Python library designed to make working with Zookeeper a more hassle-free experience that is less prone to errors.

 

链接如下:https://kazoo.readthedocs.org/en/latest/

GitHub地址: https://github.com/python-zk/kazoo

 

 首先,我们去GitHub,下载其源码包。解压缩之后,进行安装

python setup.py install

 

OK,准备工作完成,一切尽在代码中:

文件名:zk_lock.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env python2. 7  
# -*- coding:utf- 8  -*-  
#  
#   Author  :   yunjianfei  
#   E-mail  :   yunjianfei1987 @gmail .com  
#   Date    :    2014 / 12 / 09  
#   Desc    :  
#  
   
import  logging, os, time  
from kazoo.client  import  KazooClient  
from kazoo.client  import  KazooState  
from kazoo.recipe.lock  import  Lock  
   
class  ZooKeeperLock():  
     def __init__(self, hosts, id_str, lock_name, logger=None, timeout= 1 ):  
         self.hosts = hosts  
         self.id_str = id_str  
         self.zk_client = None  
         self.timeout = timeout  
         self.logger = logger  
         self.name = lock_name  
         self.lock_handle = None  
   
         self.create_lock()  
   
     def create_lock(self):  
         try :  
             self.zk_client = KazooClient(hosts=self.hosts, logger=self.logger, timeout=self.timeout)  
             self.zk_client.start(timeout=self.timeout)  
         except Exception, ex:  
             self.init_ret = False  
             self.err_str =  "Create KazooClient failed! Exception: %s"  % str(ex)  
             logging.error(self.err_str)  
             return  
   
         try :  
             lock_path = os.path.join( "/" "locks" , self.name)  
             self.lock_handle = Lock(self.zk_client, lock_path)  
         except Exception, ex:  
             self.init_ret = False  
             self.err_str =  "Create lock failed! Exception: %s"  % str(ex)  
             logging.error(self.err_str)  
             return  
   
     def destroy_lock(self):  
         #self.release()  
   
         if  self.zk_client != None:  
             self.zk_client.stop()  
             self.zk_client = None  
   
     def acquire(self, blocking=True, timeout=None):  
         if  self.lock_handle == None:  
             return  None  
   
         try :  
             return  self.lock_handle.acquire(blocking=blocking, timeout=timeout)  
         except Exception, ex:  
             self.err_str =  "Acquire lock failed! Exception: %s"  % str(ex)  
             logging.error(self.err_str)  
             return  None  
   
     def release(self):  
         if  self.lock_handle == None:  
             return  None  
         return  self.lock_handle.release()  
   
   
     def __del__(self):  
         self.destroy_lock()  
   
   
def main():  
     logger = logging.getLogger()  
     logger.setLevel(logging.INFO)  
     sh = logging.StreamHandler()  
     formatter = logging.Formatter( '%(asctime)s -%(module)s:%(filename)s-L%(lineno)d-%(levelname)s: %(message)s' )  
     sh.setFormatter(formatter)  
     logger.addHandler(sh)  
   
     zookeeper_hosts =  "192.168.10.2:2181, 192.168.10.3:2181, 192.168.10.4:2181"  
     lock_name =  "test"  
   
     lock = ZooKeeperLock(zookeeper_hosts,  "myid is 1" , lock_name, logger=logger)  
     ret = lock.acquire()  
     if  not ret:  
         logging.info( "Can't get lock! Ret: %s" , ret)  
         return  
   
     logging.info( "Get lock! Do something! Sleep 10 secs!" )  
     for  i in range( 1 11 ):  
         time.sleep( 1 )  
         print str(i)  
   
     lock.release()  
   
if  __name__ ==  "__main__" :  
     try :  
         main()  
     except Exception, ex:  
         print  "Ocurred Exception: %s"  % str(ex)  
         quit()


测试的时候,只需要改一下“zookeeper_hosts ”这个参数,改为你自己的ZooKeeper的server地址即可.

 

将该测试文件copy到多个服务器,同时运行,就可以看到分布式锁的效果了。



转自:http://yunjianfei.iteye.com/blog/2164888






      本文转自布拉君君 51CTO博客,原文链接:http://blog.51cto.com/5148737/1975603,如需转载请自行联系原作者




相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
8天前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
|
1月前
|
Ubuntu Shell Linux
pyenv 管理多个 Python 版本(1)
pyenv 管理多个 Python 版本(1)
184 86
pyenv 管理多个 Python 版本(1)
|
3月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
432 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
1月前
|
Shell Python
使用 pyenv 来管理多个 Python 版本(2)
使用 pyenv 来管理多个 Python 版本(2)
120 71
使用 pyenv 来管理多个 Python 版本(2)
|
1月前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
178 73
|
11天前
|
分布式计算 DataWorks 数据处理
产品测评 | 上手分布式Python计算服务MaxFrame产品最佳实践
MaxFrame是阿里云自研的分布式计算框架,专为大数据处理设计,提供高效便捷的Python开发体验。其主要功能包括Python编程接口、直接利用MaxCompute资源、与MaxCompute Notebook集成及镜像管理功能。本文基于MaxFrame最佳实践,详细介绍了在DataWorks中使用MaxFrame创建数据源、PyODPS节点和MaxFrame会话的过程,并展示了如何通过MaxFrame实现分布式Pandas处理和大语言模型数据处理。测评反馈指出,虽然MaxFrame具备强大的数据处理能力,但在文档细节和新手友好性方面仍有改进空间。
|
19天前
|
数据采集 人工智能 分布式计算
🚀 MaxFrame 产品深度体验评测:Python 分布式计算的未来
在数据驱动的时代,大数据分析和AI模型训练对数据预处理的效率要求极高。传统的Pandas工具在小数据集下表现出色,但面对大规模数据时力不从心。阿里云推出的Python分布式计算框架MaxFrame,以“Pandas风格”为核心设计理念,旨在降低分布式计算门槛,同时支持超大规模数据处理。MaxFrame不仅保留了Pandas的操作习惯,还通过底层优化实现了高效的分布式调度、内存管理和容错机制,并深度集成阿里云大数据生态。本文将通过实践评测,全面解析MaxFrame的能力与价值,展示其在大数据和AI场景中的卓越表现。
41 4
🚀 MaxFrame 产品深度体验评测:Python 分布式计算的未来
|
7天前
|
人工智能 分布式计算 大数据
MaxFrame 产品评测:大数据与AI融合的Python分布式计算框架
MaxFrame是阿里云MaxCompute推出的自研Python分布式计算框架,支持大规模数据处理与AI应用。它提供类似Pandas的API,简化开发流程,并兼容多种机器学习库,加速模型训练前的数据准备。MaxFrame融合大数据和AI,提升效率、促进协作、增强创新能力。尽管初次配置稍显复杂,但其强大的功能集、性能优化及开放性使其成为现代企业与研究机构的理想选择。未来有望进一步简化使用门槛并加强社区建设。
43 7
|
5天前
|
SQL 分布式计算 数据处理
云产品评测|分布式Python计算服务MaxFrame | 在本地环境中使用MaxFrame + 基于MaxFrame实现大语言模型数据处理
本文基于官方文档,介绍了由浅入深的两个部分实操测试,包括在本地环境中使用MaxFrame & 基于MaxFrame实现大语言模型数据处理,对步骤有详细说明。体验下来对MaxCompute的感受是很不错的,值得尝试并使用!
29 1
|
14天前
|
SQL 分布式计算 DataWorks
MaxCompute MaxFrame评测 | 分布式Python计算服务MaxFrame(完整操作版)
在当今数字化迅猛发展的时代,数据信息的保存与分析对企业决策至关重要。MaxCompute MaxFrame是阿里云自研的分布式计算框架,支持Python编程接口、兼容Pandas接口并自动进行分布式计算。通过MaxCompute的海量计算资源,企业可以进行大规模数据处理、可视化数据分析及科学计算等任务。本文将详细介绍如何开通MaxCompute和DataWorks服务,并使用MaxFrame进行数据操作。包括创建项目、绑定数据源、编写PyODPS 3节点代码以及执行SQL查询等内容。最后,针对使用过程中遇到的问题提出反馈建议,帮助用户更好地理解和使用MaxFrame。