Golang在没有显式文件锁定的情况下同时读/写文件

时间:2016-06-04 10:00:33

标签: go io synchronization

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

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

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

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

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

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

P.S。 golang,linux,ext4

1 个答案:

答案 0 :(得分:2)

我假设随机阅读"你实际上是指"随意阅读"。

如果我正确理解您的用例,您不需要寻求或锁定或做任何手动操作。 UNIX通过O_APPEND覆盖了这个。您可以这样做:

  1. 使用os.O_APPEND打开文件。这样,每次写入,无论前面的任何操作,都将转到文件的末尾
  2. 阅读时使用File.ReadAt。这允许您为读取指定任意偏移量
  3. 使用此方案可以避免任何类型的锁定:操作系统会为您执行此操作。由于缓冲区缓存,这种方案甚至效率不高:附加和读取几乎是独立的。