同时写入/读取时是否应该关闭文件?

时间:2019-02-19 11:04:17

标签: file go concurrency

我正在构建一个可以同时从文件(从net/http处理程序填充的goroutines)中读写文件的服务器。我创建了以下结构:

type transactionsFile struct {
    File  *os.File
    Mutex *sync.RWMutex
}

我正在init()函数中初始化文件一次。我应该在每次写操作时以某种方式关闭它吗?

1 个答案:

答案 0 :(得分:4)

您无法写入已关闭的文件,因此,如果在每次写入操作之后将其关闭,则还必须在每次写入之前(重新)打开它。

这将是非常低效的。因此,请使其保持打开状态,并仅在应用程序即将终止时将其关闭(这是必需的,因为File.Write()不保证在返回时将数据写入磁盘)。由于您是通过HTTP处理程序编写文件的,因此您应该实现正常的服务器终止,并在此之后关闭文件。有关详细信息,请参见Server.Shutdown()

此外,如果编写共享文件的目的是创建某种记录器,则可以利用log包,因此您不必使用互斥体。有关详细信息,请参见net/http set custom logger