【问题标题】:How to perform file-locking on Windows without installing a new package如何在不安装新软件包的情况下在 Windows 上执行文件锁定
【发布时间】:2015-08-07 01:34:19
【问题描述】:

我已将 code 添加到 Python 包 (brian2) 中,该包在文件上设置了排他锁以防止出现竞争条件。但是,由于此代码包含对fcntl 的调用,因此它不适用于 Windows。有没有办法让我在不安装新软件包的情况下对 Windows 中的文件进行独占锁定,例如 pywin32? (我不想给brian2添加依赖。)

【问题讨论】:

  • 你有模块msvcrt吗?
  • @cdarke 我没有,但你认为这仅仅是因为我在一台 unix 机器上吗?它是否仅在 Windows 机器上成为标准配置?
  • 我不希望它出现在 UNIX 机器上 - 问题是关于 Windows 的,不是吗?我已经检查过了,它是 Windows 的 Python 标准库的一部分。不幸的是,很难生成可移植的文件锁定代码,因为操作是如此不同(请参阅我的帖子)。
  • @cdarke 感谢您的检查。我猜fcntl 没有附带 Windows 上的标准库?
  • 没错,fcntl 没有与 Windows 上的 Python 2 或 3 捆绑在一起。

标签: python locking pywin32 fcntl


【解决方案1】:

由于msvcrt 是标准库的一部分,我假设您拥有它。 msvcrt(MicroSoft Visual C 运行时)模块仅实现了 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() 不同,没有开始参数(或来源)。 lock 或 unlock 调用仅对当前文件位置进行操作。这意味着为了解锁正确的区域,我们必须将当前文件位置移回我们进行读取或写入之前的位置。解锁后,我们现在必须再次推进文件位置,回到读取或写入后的位置,这样我们才能继续。

如果我们解锁一个我们没有锁定的区域,那么我们不会收到错误或异常。

【讨论】:

  • 文件关闭时锁会自动释放吗?
  • @dbliss:我不确定,而且我现在没有方便的 Windows 机器来尝试它。医生没有说,所以我不会打赌。对了,我这里放了一个demo:darkeside.blogspot.co.uk/2010/11/…
  • 据我所知,但我也没有 Windows 机器来测试它。
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 2017-05-31
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 2017-05-14
相关资源
最近更新 更多