python 使用 fcntl 实现锁操作

#!/usr/bin/env python
#encoding: utf8

import sys, os, time
import fcntl,errno
import struct

class LockException(Exception):
    pass

lock_dir = '/tmp'

def lock(lock_name, timeout=0, mode=0600):
    def decorator(func):
        def wrapper(*args, **kwargs):
            old_umask = os.umask(0)
            try:
                lock_file = os.path.join(lock_dir, '.%s.lck' % lock_name)
                lock_fd = os.open(lock_file, os.O_CREAT|os.O_WRONLY, mode)
                os.umask(old_umask)
            except OSError, e:
                os.umask(old_umask)
                raise LockException("lock error: %s" % e)

            lock_flags = fcntl.LOCK_EX
            if timeout is not None:
                lock_flags |= fcntl.LOCK_NB

            start_time = time.time()
            while True:
                try:
                    fcntl.lockf(lock_fd, lock_flags)
                    break
                except IOError, e:
                    if e.errno == errno.EAGAIN and time.time() < (start_time + timeout):
                        time.sleep(0.05)
                    else:
                        raise LockException("Lock error:%s", e)
            try:
                return func(*args, **kwargs)
            finally:
                fcntl.lockf(lock_fd, fcntl.LOCK_UN);
        return wrapper
    return decorator


@lock("test", timeout=10, mode=0666)
def LockFunc():
    print "lockRun..."

if __name__ == "__main__":
    LockFunc()

 

转载于:https://my.oschina.net/tsh/blog/1527569

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值