python __file__怎么实现_python lockfile(文件锁)

一个lock file的python实现

如果多个进程,或者多个独立程序要写同一个文件,那么就存在大家同时写文件的可能,这就不妙了,数据可能会出问题。最近在网上找到一个开源的python实现,有效简洁,列出来分析下代码看看:

文件名:lockfile.py,内容如下,有部分注释加了中文,添加了一些注释。

import os

import time

import errno

class FileLockException(Exception):

pass

class FileLock(object):

""" A file locking mechanism that has context-manager support so

you can use it in a with statement. This should be relatively cross

compatible as it doesn't rely on msvcrt or fcntl for the locking.

"""

def __init__(self, file_name, timeout=10, delay=.05):

""" Prepare the file locker. Specify the file to lock and optionally

the maximum timeout and the delay between each attempt to lock.

"""

self.is_locked = False

self.lockfile = os.path.join(os.getcwd(), "%s.lock" % file_name)

self.file_name = file_name

self.timeout = timeout

self.delay = delay

def acquire(self):

""" Acquire the lock, if possible. If the lock is in use, it check again

every `wait` seconds. It does this until it either gets the lock or

exceeds `timeout` number of seconds, in which case it throws

an exception.

"""

start_time = time.time()

while True:

try:

#独占式打开文件

self.fd = os.open(self.lockfile, os.O_CREAT|os.O_EXCL|os.O_RDWR)

break;

except OSError as e:

if e.errno != errno.EEXIST:

raise

if (time.time() - start_time) >= self.timeout:

raise FileLockException("Timeout occured.")

time.sleep(self.delay)

self.is_locked = True

def release(self):

""" Get rid of the lock by deleting the lockfile.

When working in a `with` statement, this gets automatically

called at the end.

"""

#关闭文件,删除文件

if self.is_locked:

os.close(self.fd)

os.unlink(self.lockfile)

self.is_locked = False

def __enter__(self):

""" Activated when used in the with statement.

Should automatically acquire a lock to be used in the with block.

"""

if not self.is_locked:

self.acquire()

return self

def __exit__(self, type, value, traceback):

""" Activated at the end of the with statement.

It automatically releases the lock if it isn't locked.

"""

if self.is_locked:

self.release()

def __del__(self):

""" Make sure that the FileLock instance doesn't leave a lockfile

lying around.

"""

self.release()

"""

#use as:

from filelock import FileLock

with FileLock("myfile.txt"):

# work with the file as it is now locked

print("Lock acquired.")

""" 用法比较有意思,使用with关键字。对with关键字来说,FileLock类先执行__enter__函数,然后,执行with块里的那些代码,执行完了之后,再执行__exit__函数,等价于相当于如下形式: try: 执行 __enter__的内容 执行 with_block. finally: 执行 __exit__内容 FileLock在__enter__函数独占式创建或打开一个文件,这个文件不会被其他程序或者进程再次创建或者打开,由此形成lock,执行完代码,在__exit__里,关闭并删除文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python多线程编程中,Lock)和可重入(RLock)都是常用的同步机制,用于保护共享资源,防止多个线程同时访问导致数据错误。 Lock是一种最基本的,它将资源住,直到被释放。当一个线程获得时,其他线程必须等待该线程释放后才能获得。这种是不可重入的,即同一个线程不能重复获得同一把。 RLock是可重入,它允许一个线程多次获得同一把。当一个线程获得时,它可以再次获得这个而不会被阻塞。只有该线程释放的次数与获得的次数相等时,其他线程才能获得该。可重入在需要多次获得同一把的场景中很有用。 下面是使用Lock和RLock的示例代码: ```python import threading # 创建一个Lock对象 lock = threading.Lock() # 创建一个RLock对象 rlock = threading.RLock() # 使用Lock保护共享资源 class Counter(object): def __init__(self): self.value = 0 def increment(self): lock.acquire() try: self.value += 1 finally: lock.release() # 使用RLock保护共享资源 class ReentrantCounter(object): def __init__(self): self.value = 0 def increment(self): rlock.acquire() try: self.value += 1 # 再次获得 rlock.acquire() try: self.value += 1 finally: rlock.release() finally: rlock.release() ``` 在上面的代码中,Counter类使用Lock保护value属性,而ReentrantCounter类使用RLock保护value属性。在increment方法中,Counter使用lock.acquire()和lock.release()获取和释放,在同一时间只允许一个线程访问value属性。而ReentrantCounter使用rlock.acquire()和rlock.release()获取和释放,并且在方法内部重复获得,这是RLock的特性。 需要注意的是,使用时要避免死的情况发生,即多个线程相互等待对方释放的情况。因此,在编写代码时要考虑好的获取和释放顺序,以避免死的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值