【问题标题】:How to implement the functionality of lockfile command如何实现lockfile命令的功能
【发布时间】:2016-12-26 16:21:35
【问题描述】:

我正在尝试为在集群上运行的软件实现基于文件系统的锁定。底层共享文件系统使用DRBD 实现,因此可以认为保证了同步性。我当前的实现如下所示:

# check the lock file                                                                                                 
if os.path.isfile(lockfile):                                                                                       
    if time.time() - os.path.getmtime(lockfile) > 3600:                                                             
        logInfo('lock is older than 3600s, removing it and going on collecting result.')                           
        os.remove(lockfile)                                                                                        
    else:                                                                                                             
        logInfo('Previous action is still on-going, please wait until it\'s finished or timeout.')
        sys.exit(1)

# create the lock file                                                                                                
open(lockfile, 'w').close();

显然,当集群中不同机器上运行的多个脚本实例可能会一致认为系统已解锁,创建锁定文件并执行需要互斥的操作时,可能会出现这种情况。

总而言之,我需要一个基于文件系统的锁定工具,并且锁定检查和创建一起形成一个原子操作。

使用lockfile 命令可以在shell 脚本中实现相同的功能。

【问题讨论】:

    标签: python cluster-computing


    【解决方案1】:

    使用os.open可以实现一个解决方案,它封装了open系统调用:

    import os,errno
    def lockfile(filename):
        try:
            os.close(os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY));
        except OSError as e:
            if e.errno == errno.EEXIST:  # System is already locked as the file already exists.
                return False
            else:  # Something unexpected went wrong so reraise the exception.
                raise
        return True  # System has successfully been locked by the function
    

    注意 os.open() 的第二个参数。根据this answer,当使用标志 O_EXCL 与 O_CREAT 一起使用时,并且路径名已经存在,那么 open() 将失败,或者更准确地说,将引发一个带有 errno EEXIST 的 OSError,这在我们的例子中意味着系统已经锁定。但是,当路径指向一个不存在的文件时,它会立即被创建,不会给文件系统的其他用户留出时间来同时执行相同的步骤。 并且根据this one,所描述的技术可以被认为是广泛的平台无关的。

    【讨论】:

    • 没有新轮子,如果可能的话:lockfile package,或者可能是未弃用的fasteners
    • @dhke 我不会包含一个 20+KB 的包来实现可以在十行内实现的功能...
    • 我现在会的。即使只是为了事实,我没有编写的代码是不包含我的错误的代码;)
    • @dhke 纠正别人的错误总是比我们的更糟糕
    • 现在这真的很哲学,但我明白你的意思。作为旁注:一个人可能会想吃饱flopen()
    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 2022-10-19
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2022-07-04
    相关资源
    最近更新 更多