【问题标题】:GAE Go — Async datastore API?GAE Go — 异步数据存储 API?
【发布时间】:2013-02-16 10:07:33
【问题描述】:

是否有类似于 Python/Java 的异步数据存储 API 的 Go 语言?还是可以只使用带有go 关键字的普通API?

【问题讨论】:

    标签: google-app-engine asynchronous go


    【解决方案1】:

    对于任何 AppEngine 服务,没有与 Python 或 Java 异步 API 等效的 Go。事实上,Go 标准库也没有任何标准异步风格。原因是在 Go 中,您使用阻塞样式编写函数,并根据需要使用一些基本的并发原语来组合它们。虽然您不能只在dastore.Get 调用的开头加上go,但它仍然相对简单。考虑以下人为设计的示例:

    func loadUser(ctx appengine.Context, name strings) (*User, err) {
      var u User
      var entries []*Entry
      done := make(chan error)
    
      go func() {
        // Load the main features of the User
        key := datastore.NewKey(ctx, "user", name, 0, nil)
        done <- datastore.Get(ctx, key)
      }()
    
      go func() {
        // Load the entries associated with the user
        q := datastore.NewQuery("entries").Filter("user", name)
        keys, err := q.GetAll(ctx, &entries)
        for i, k := range keys {
          entries[i].key = k
        }
        done <- err
      }()
    
      success := true
      // Wait for the queries to finish in parallel
      for i := 0; i < 2 /* count the funcs above */; i++ {
        if err := <-done; err != nil {
          ctx.Errorf("loaduser: %s", err)
          success = false
        }
      }
      if !success {
        return
      }
    
      // maybe more stuff here
    }
    

    几乎可以在任何需要同时运行多个可能需要一段时间的事情的环境中使用相同的方法,无论是数据存储调用、urlfetch、文件加载等。

    【讨论】:

    • 鉴于 GAE 上的 Go 应用程序在单线程上运行,这如何工作?
    • Go 运行时将许多 goroutine 多路复用到单个操作系统线程上。事实上,即使在 AppEngine 之外,默认值也是 GOMAXPROCS=1,这意味着只有一个 goroutine 会主动运行您的代码。尽管如此,当 goroutine 通信、阻塞、执行系统调用或等待锁时,运行时会在 goroutine 之间来回交换。
    • 谢谢。那么,如果它们在单线程上运行,甚至还有性能优势吗?原谅我的无知。编辑:我猜性能优势将来自等待 I/O 调用返回时执行代码?
    • 没错。运行时来回交换,以便在有任何东西要运行时总是有东西在运行。
    【解决方案2】:

    Go 中没有明确的异步 API。您应该改用 go 例程。我没有看到任何有关这方面的资料,但我怀疑异步 API 不存在,因为使用 go 例程非常容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2012-12-28
      • 2015-04-30
      相关资源
      最近更新 更多