web-applications - Golang Web 应用程序中的同步

标签 web-applications concurrency sqlite synchronization go

我正在编写一个 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/

相关文章:

javascript - 有什么方法可以在 NetBeans 或其他 IDE 中获取导入的 JavaScript 的代码完成吗?

javascript - GWT 或 DOJO 或其他?

java - JRE 如何为具有非有效最终局部变量的 lambda 体创建并发问题?

java - 线程意外操纵的变量

DatabaseError : Unable to open db file, 但仅适用于 Django 管理员

java - 阐明对 JSF 2.0 的理解

authentication - 登录 ID 使用什么?

c++ - C++ map of maps 上的细粒度锁

android - 如何在 android 中打开 SQLite 数据库?

java - 单击 ListView 中的项目时,Android 应用程序崩溃