使用python fcntl实现本地文件互斥锁

文件互斥锁是什么?  他的应用场景又是什么? 

这是我前段是开发的一个模块,主要用途是避免了多个程序多个进程需要数据安全.  可能场景我没有描述清楚,简单描述就是,解决多进程下需要的互斥锁的场景.. 对于互斥锁,我开发的,提交过的项目代码已经够多了,比如redis分布式锁,etcd分布式锁,但是就没有一个本地互斥锁 ,正好有实现的代码,也一块开源了.


尤其不严谨,python本地文件互斥锁后期会有所修改,请到原文链接中查看更新, http://xiaorui.cc/2015/11/29/%E4%BD%BF%E7%94%A8python-fcntl%E5%AE%9E%E7%8E%B0%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E4%BA%92%E6%96%A5%E9%94%81/


代码已经推送到github和pypi上了.

https://github.com/rfyiamcool/local_mutex

https://pypi.python.org/pypi/local_mutex


我要开始正经的介绍这项目了,本地互斥锁的英文名是, local_mutex


功能介绍,  一个简单的本地锁, 通过fcntl针对文件实现加锁. 可以起到多个进程下互斥锁的效果. 需要强烈注意的是,多线程下是无效的,原因?  自己查fcntl的特性,再说也没必要用fcntl内核锁


Usage:
最简单的例子,适合一个程序同时跑一个的场景.

#blog: xiaorui.cc

import sys
from local_mutex import LocalMutex

try:
    lock = LocalMutex('app.lock')
except LockError:
    sys.exit('already running')

try:
    print 'doing'
finally:
    lock.release()

使用wait参数不停的试图获取Lock, 直到获取锁.

#blog : xiaorui.cc

lock = LocalMutex('/var/run/app.lock', wait = True)
try:
    print 'doing'
finally:
    lock.release()

使用with关键词

#blog: xiaorui.cc
with LocalMutex('app.lock', wait = True):
    print 'doing'

有个哥们发邮件一直问我,如果是多线程环境, 怎么搞?  你mei呀,不知道threading下有个Lock()互斥锁呀….  直接用threading的Lock就搞定了…  

import threading
lock = threading.Lock()
with lock:
    pass

就这样了,有兴趣的朋友可以用用.   另外这个场景也比较适合crontab下,避免除非执行的效果. 


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

邮箱地址不会被公开。 必填项已用*标注