我正在编写一个 golang 网络应用程序。 Web 应用程序访问文件系统(读取和写入)和一个 sqlite3 数据库文件。
问题 1:如何在 Go 中同步文件系统访问?
type DataObject struct {
data []byte
}
func (*d DataObject) Write() {
//
// Synchronization ?
//
ioutil.WriteFile("file.name", d.data, 0644)
//
// Stop synchronization ?
//
}
问题2:需要同步sqlite3数据库文件访问吗?
type SqlObject struct {
sqldata string
}
func (*s SqlObject) Store() error {
//
// Open the file, do I need some sort of synchronization?
//
con, err := sqlite.Open("database/datafile.db")
if err != nil {
return err
}
defer con.Close()
err = con.Exec("INSERT INTO data(sqldata) values(?)", s.sqldata)
if err != nil {
return err
}
return nil
}
我正在使用 gosqlite3 驱动程序 ( http://code.google.com/p/gosqlite/ )。
最佳答案
对于文件,这取决于您的应用程序。如果只有一个 goroutine 写入文件,则不需要。如果不止一个,则取决于:
如果您在不同进程(程序)之间进行协调,您可以使用 flock (而且它可能不会很有趣)。
如果您在程序中协调多个 goroutine,您可以使用 mutexes或者您可以查看是否可以重新组织程序,以便只有一个例程写入文件,而其他例程通过 channel 发送更新。
对于 SQLite,我认为最简单的方法是保持一个 sqlite 连接打开并从各种 goroutines 中使用它;尽管它确实支持同时打开它的多个进程,并且如果您的系统执行许多并发读取可能会更快(它使用全局锁进行写入)。
关于web-applications - Golang Web 应用程序中的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14779769/