Python 并发日志读取
我一直在使用 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.