Python 并发日志读取

0 投票
1 回答
784 浏览
提问于 2025-04-21 02:14

我一直在使用 ConcurrentLogHandler 来进行多平台和多进程的文件日志记录。

现在我想确保我读取的是“原子”部分的日志,也就是说,我不想读取到一半的日志行。例如,那个并发文件记录器实际上会对文件进行 LOCK_EX(独占锁定),有没有人尝试过在 ConcurrentLogHandler 文件上使用 LOCK_SH(共享锁定)?我在这个模块的服务里没有看到这样的读取方式。

或者你有没有在使用其他 Python 模块时,有过多次读取/单次写入的经验?(不想重新手动编写所有代码)

1 个回答

1

ConcurrentLogHandler 只是利用了操作系统提供的文件锁工具(在类Unix系统上用的是 fcntl.flock,在Windows上用的是 win32file.LockFileEx),所以如果你对文件使用 LOCK_SH(共享锁),应该不会有问题;当 ConcurrentLogHandler 尝试获取它的 LOCK_EX(独占锁)时,会遵循这个锁的规则。最简单的方法是使用一个叫做 portalocker 模块,这个模块已经包含在 ConcurrentLogHandler 里面:

import portalocker

with open("logfile.txt") as f:
    portalocker.lock(f, portalocker.LOCK_SH)
    for line in f:
        # do stuff with each line
# file will be unlocked when its closed.

撰写回答