小能豆

在 Python 中锁定文件

javascript

我需要锁定一个文件以使用 Python 进行写入。它将同时被多个 Python 进程访问。我在网上找到了一些解决方案,但大多数都无法满足我的目的,因为它们通常仅基于 Unix 或 Windows。


阅读 31

收藏
2024-07-02

共1个答案

小能豆

要锁定一个文件以便用 Python 编写,并使其可同时从多个 Python 进程访问,您可以fcntl在基于 Unix 的系统上使用模块,msvcrtwin32fileWindows 上使用模块。以下是使用适用于不同平台的文件锁定技术的通用方法:

使用fcntl(基于 Unix 的系统)和msvcrt(Windows)

  1. 基于 Unix 的系统(Linux、macOS 等):

  2. 您可以使用fcntl模块在文件上创建咨询锁。此锁将阻止其他进程在您的进程拥有锁时修改文件。

```
import fcntl
import os

def lock_file(file):
fd = os.open(file, os.O_RDWR)
try:
fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
return fd
except IOError:
# Failed to acquire lock
os.close(fd)
return None

def unlock_file(fd):
if fd is not None:
fcntl.flock(fd, fcntl.LOCK_UN)
os.close(fd)

# Example usage:
file_path = ‘example.txt’
fd = lock_file(file_path)
if fd:
try:
# Do your file writing operations here
with open(file_path, ‘a’) as f:
f.write(“Data to write\n”)
finally:
unlock_file(fd)
```

  • Unix 的解释:

    • fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB):此行尝试获取LOCK_EX文件描述符上的独占锁 ( ) fd。如果锁不可用 ( LOCK_NB),则会引发IOError
    • fcntl.LOCK_UN:处理完文件后释放锁。
  • 视窗:

  • 在 Windows 上,文件锁定通常使用msvcrtwin32file模块来处理。以下是使用的基本示例msvcrt

```
import msvcrt
import os

def lock_file(file):
fd = os.open(file, os.O_RDWR | os.O_CREAT)
try:
msvcrt.locking(fd, msvcrt.LK_NBLCK, 0)
return fd
except IOError:
# Failed to acquire lock
os.close(fd)
return None

def unlock_file(fd):
if fd is not None:
os.close(fd)

# Example usage:
file_path = ‘example.txt’
fd = lock_file(file_path)
if fd:
try:
# Do your file writing operations here
with open(file_path, ‘a’) as f:
f.write(“Data to write\n”)
finally:
unlock_file(fd)
```

  • Windows 的解释:
    • msvcrt.locking(fd, msvcrt.LK_NBLCK, 0):此函数调用尝试获取文件描述符上的非阻塞锁fd
    • msvcrt.LK_NBLCK:指定非阻塞锁。
    • 清理和文件处理与基于 Unix 的方法类似。

跨平台注意事项:

  • 并发处理:这些方法提供了适合处理来自多个 Python 进程的并发访问的基本文件锁定机制。
  • 平台细节:确保在不同的平台上测试文件锁定方法以验证兼容性和行为,特别是当您的应用程序需要同时支持基于 Unix 和 Windows 的环境时。

通过使用这些技术,您可以有效地管理跨不同操作系统的 Python 文件锁定,确保多个进程安全地并发访问共享文件。

2024-07-02