Go-lang Web应用程序中的同步

Kir*_*ril 4 sqlite concurrency synchronization web-applications go

我正在写一个golang web应用程序.Web应用程序访问文件系统(读取和写入)和sqlite3数据库文件.

问题1:如何在Go中同步文件系统访问?

type DataObject struct {
  data []byte
}

func (*d DataObject) Write() {
   //
   // Synchronization ?
   //
   ioutil.WriteFile("file.name", d.data, 0644)
   //
   // Stop synchronization ?
   //
}
Run Code Online (Sandbox Code Playgroud)

问题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
}
Run Code Online (Sandbox Code Playgroud)

我正在使用gosqlite3驱动程序(http://code.google.com/p/gosqlite/).

Ask*_*sen 7

对于文件,它取决于您的应用程序.如果你只有一个goroutine写入文件,你不应该.如果不止一个则取决于:

如果你在不同的进程(程序)之间进行协调,你可以使用flock(它可能不会很有趣).

如果您正在协调程序中的多个goroutine,您可以使用互斥锁,或者您可以查看是否可以重新组织程序,这样只需要一个例程写入文件,其他例程通过通道发送更新.

对于SQLite,我认为最简单的方法是保持一个sqlite连接打开并使用来自各种goroutines的连接; 虽然它支持多个进程同时打开它,如果你的系统执行许多可能更快的并发读取(它使用全局锁写入).