Golang 同时读/写文件,无需显式文件锁定

let*_*4be 4 io synchronization go

我有一种情况,我需要同时从/向文件读/写,但操作范围有限

  • 仅追加,无随机偏移写入
  • 从随机位置读取,我确定之前已经写入了内容(通过附加,通过golang通道进行内部访问序列化以确保仅在附加内容后才发生随机读取)
  • 只有一个进程在运行

这是一个高负载的应用程序,我想避免每次读/写时都锁定文件

我打算打开 2 个文件 - 一个用于读取,另一个仅用于附加

这样做会产生一些潜在的问题/错误吗?

如果我想避免每次读/写的文件锁定,推荐的做法是什么?

ps golang, linux, ext4

cni*_*tar 5

我假设“随机读取”实际上是指“任意读取”。

如果我正确理解了您的用例,则您无需查找或锁定或手动执行任何操作。UNIX 通过O_APPEND. 您可以执行以下操作:

  1. os.O_APPEND.打开文件。这样每次写入,无论之前的任何操作,都将转到文件末尾
  2. 阅读时使用File.ReadAt. 这使您可以为读取指定任意偏移量

使用此方案您可以避免任何类型的锁定:操作系统会为您完成。由于缓冲区缓存,该方案甚至不是低效的:追加和读取几乎是独立的。

  • 你确定没有数据损坏的机会吗?读取可能与追加并行发生,我唯一的保证是读取总是对先前追加的数据(在另一个 goroutine 中)完成 - 这通过为读取提供“适当的”偏移量来强制执行。有没有可以链接的官方文档? (2认同)