iis搭建网站404,海淀网站建设价格,腾讯域名注册官网,网络设计师未来人生规划此文章#xff0c;实现python 版本的分布式锁#xff0c;java版本的可以使用curator很容易实现#xff0c;python版本如下在做分布式系统开发的时候#xff0c;分布式锁可以说是必需的一个组件。最近做了一些调研和尝试#xff0c;经过对比#xff0c;基于ZooKeeper的分布… 此文章实现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#!/usr/bin/env python2.7
# -*- coding:utf-8 -*-
#
# Author : yunjianfei
# E-mail : yunjianfei1987gmail.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, loggerNone, timeout1): 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(hostsself.hosts, loggerself.logger, timeoutself.timeout) self.zk_client.start(timeoutself.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, blockingTrue, timeoutNone): if self.lock_handle None: return None try: return self.lock_handle.acquire(blockingblocking, timeouttimeout) 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, loggerlogger) ret lock.acquire() if not ret: logging.info(Cant 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 转载于:https://blog.51cto.com/5148737/1975603