如何在Windows上执行文件锁定而无需安装新软件包

7
我已经将 code 添加到一个Python包(brian2)中,该包会对文件进行独占锁定以防止竞态条件。然而,由于此代码包含对fcntl的调用,因此它在Windows上无法工作。有没有办法在Windows上放置独占锁定文件,而不需要安装新的软件包,例如pywin32?(我不想添加依赖项到brian2)。

你有模块 msvcrt 吗? - cdarke
@cdarke 我没有它,但你认为这是因为我在Unix机器上吗?它只在Windows机器上标准吗? - abcd
1
我不会期望这个程序在UNIX机器上运行,因为问题是关于Windows的,不是吗?我已经检查过了,在Python标准库中,它是Windows的一部分。不幸的是,生成可移植的文件锁定代码很困难,因为操作方式非常不同(请参见我的帖子)。 - cdarke
@cdarke,感谢您的检查。我猜想在Windows上标准库中没有fcntl - abcd
没错,fcntl在Windows上的Python 2或3中没有捆绑。 - cdarke
1个回答

5

由于 msvcrt 是标准库的一部分,我认为您已经拥有了它。然而,msvcrt(MicroSoft Visual C Run Time)模块只实现了 MS RTL 中少量可用例程,但它确实实现了文件锁定。

以下是一个示例:

import msvcrt, os, sys

REC_LIM = 20

pFilename = "rlock.dat"
fh = open(pFilename, "w")

for i in range(REC_LIM):

    # Here, construct data into "line"

    start_pos  = fh.tell()    # Get the current start position   

    # Get the lock - possible blocking call   
    msvcrt.locking(fh.fileno(), msvcrt.LK_RLCK, len(line)+1)
    fh.write(line)            #  Advance the current position
    end_pos = fh.tell()       #  Save the end position

    # Reset the current position before releasing the lock 
    fh.seek(start_pos)        
    msvcrt.locking(fh.fileno(), msvcrt.LK_UNLCK, len(line)+1)
    fh.seek(end_pos)          # Go back to the end of the written record

fh.close()

所示示例与fcntl.flock()具有类似的功能,但代码非常不同。仅支持独占锁。 与fcntl.flock()不同,没有启动参数(或whence)。锁定或解锁调用仅对当前文件位置进行操作。这意味着为了解锁正确的区域,我们必须将当前文件位置移回读取或写入之前的位置。解锁后,我们现在必须再次推进文件位置,回到读取或写入后的位置,以便我们可以继续进行。
如果我们解锁未加锁的区域,则不会出现错误或异常。

当文件关闭时,锁是否会自动释放? - abcd
@dbliss:我不确定,而且现在手头也没有Windows机器来尝试。文档上没有说明,所以我不会打赌。顺便说一下,我在这里放了一个演示:http://darkeside.blogspot.co.uk/2010/11/python-msvcrtlocking-trials-and.html - cdarke
从我所了解的情况来看,是这样的,但我也没有Windows机器来测试。 - abcd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接