python多进程文件锁_python使用fcntl管理pidfile多进程文件锁

最近在折腾服务端,后端启动的时候,常常会遇到一个问题,由于启动方式不是通过标准的/etc/init.d/monitor start 启动的,是export PYTHONPATH=`pwd`;python monitor.py启动的。后期发现居然启动了N个进程。   这问题好解决,进程的启动关闭都需要统一入口,统一配置文件就可以了。  但是如果你的程序是被OOM了,或者是你自己kill掉,然后程序里又没有做signal的处理。那么会造成的问题就是monitor.pid 文件没有移除。 当我们想强制启动的时候,需要删除pidfile文件就可以了。

需要注意的是fcntl 对文件加锁是原子性的,不仅仅可以用于标注某进程的状态,还可以用于进程间文件操作的同步,比如python下多进程logging,这时候就可以封装一层logging,从而保证日志的完整性。

简单说下python fcntl模块:

首先对该文件进行加密

fcntl.flock(f,fcntl.LOCK_EX)

这样就对文件加锁了,如果有其他进程对test文件加锁,则不能成功,会被阻塞,但不会退出程序。

那么再来解锁:

fcntl.flock(f,fcntl.LOCK_UN)

看看fcntl的详细参数:

flock() : flock(f, operation)

f 是文件

operation : 包括:

fcntl.LOCK_UN 解锁

fcntl.LOCK_EX 排他锁

fcntl.LOCK_SH 共享锁

fcntl.LOCK_NB 非阻塞锁

LOCK_SH 共享锁:所有进程没有写访问权限,即使是加锁进程也没有。所有进程有读访问权限。

LOCK_EX 排他锁:除加锁进程外其他进程没有对已加锁文件读写访问权限。

LOCK_NB 非阻塞锁:

如果指定LOCK_NB 参数,函数如果不能获得文件锁就立即返回,否则,函数会等待获得文件锁。LOCK_NB可以同LOCK_SH或LOCK_EX进行按位或(|)运算操作。 fcnt.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)   #这个意思是 ,判断是否有锁,没有的话,就立即退出。

我把扩进程锁的需求,做成了一个开源的小模块。 看下面描述吧:

什么是python-pid ?

一个关于python pid管理的模块,借助于fcntl来给锁文件加入状态.

更多想法 .

本来是打算把进程名字和daemon都做进去的,但是考虑Pid本是个判断进程在不在的事,没必要让别的逻辑参合进来.

已经把这代码推送到github和pypi了

安装方法

方法1.

pip install python-pid

方法2

git clone git@github.com:rfyiamcool/python-pid.git

cd python-pid

python setup.py install

使用方法

可以在你的主函数加一个装饰器,可以传递pidfile的文件路径.

#coding:utf-8

@PidFileDeco('my')

def main():

import time

time.sleep(1000)

或者是直接调用,acquire是锁定,release()是释放

import time

from python_pid import PidFile

f = PidFile("mydaemon")

f.acquire()

time.sleep(100)

f.release()

使用with关键词,调用enter , exit

with PidFile("mydaemon"):

time.sleep(100)

print 'blog: xiaorui.cc'

fcntl的用处还是很多的,你可以在crontab里的脚本加入fcntl锁,这样就能保证同时只有一个进程在跑。

END… …

大家觉得文章对你有些作用!

如果想赏钱,可以用微信扫描下面的二维码,感谢!

另外再次标注博客原地址  xiaorui.cc

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值