""" 文件级并发控制 — 解决 V1 P0-4 零并发控制问题。 基于 fcntl.flock 的进程级文件锁,超时自动释放。 """ from __future__ import annotations import fcntl import os import time from pathlib import Path class FileLock: """基于 fcntl.flock(LOCK_EX | LOCK_NB) 的进程级文件锁""" def __init__(self, path: Path, timeout: float = 10.0): self._path = path.with_suffix(path.suffix + ".lock") if not path.suffix.endswith(".lock") else path self._timeout = timeout self._fd: int | None = None def __enter__(self) -> FileLock: self._fd = os.open(self._path, os.O_CREAT | os.O_RDWR) deadline = time.monotonic() + self._timeout while True: try: fcntl.flock(self._fd, fcntl.LOCK_EX | fcntl.LOCK_NB) return self except OSError: if time.monotonic() >= deadline: os.close(self._fd) self._fd = None raise TimeoutError(f"lock timeout after {self._timeout}s: {self._path}") time.sleep(0.1) def __exit__(self, *exc) -> None: if self._fd is not None: fcntl.flock(self._fd, fcntl.LOCK_UN) os.close(self._fd) self._fd = None @property def path(self) -> Path: return self._path