【问题标题】:How to use goroutine inside AppEngine?如何在 AppEngine 中使用 goroutine?
【发布时间】:2015-05-21 09:24:14
【问题描述】:

我正在使用 Cloud Endpoints 和 Go,并尝试使用 goroutine 以异步方式调用方法。

当我在本地运行以下代码时,我可以看到调试打印,但在服务器上看起来该方法没有被调用。

我基本上是在尝试做

go doStuff()

return type 

【问题讨论】:

  • 您能否提供有关您的代码的更多详细信息?根据docs“App Engine 的 Go 运行时环境提供对 goroutine 的全面支持,但不支持并行执行”。文档中并不清楚,但 Managed VM 可能没有相同的限制。

标签: google-app-engine go goroutine


【解决方案1】:

AppEngine 的 Go 运行时支持 goroutine,引用自文档:Go Runtime Environment: Introduction:

App Engine 的 Go 运行时环境完全支持 goroutine,但不支持并行执行:goroutine 被调度到单个操作系统线程上。

问题在于,当您的 HandleFunc()Handler.ServeHTTP() 返回时,AppEngine 平台(以及 http 包)不会等待处理函数启动的任何 goroutine 完成.

引用文档:Handling Requests: Responses:

App Engine 使用RequestResponseWriter 调用处理程序,然后等待处理程序写入ResponseWriter 并返回。当处理程序返回时,ResponseWriter 的内部缓冲区中的数据将发送给用户。

你必须同步你的请求处理和 goroutine,并且只有在 goroutine 完成它的工作后才返回,例如:

func doStuff(done chan int) {
    // Do your stuff
    // and finally signal that you're done:
    done <- 0
}

func someHandler(w http.ResponseWriter, r *http.Request) {
    done := make(chan int)
    go doStuff(done)
    // Wait for the goroutine to complete:
    <-done
}

【讨论】:

  • 所以基本上我必须阻止 goroutine ?我该怎么做才能避免阻塞
  • @MIkCode 不,您必须阻止请求处理程序,直到 goroutine 完成(而不是相反)。当请求处理程序返回时,就结束了。
  • 我只是想知道他们是否有任何选项可以在 goroutine 结束之前向用户返回响应?
  • @MIkCode 当请求处理程序返回时,goroutine 没有停止或任何东西。即使在处理程序返回后,goroutine 仍可能继续运行,但此后 goroutine 无法执行任何与请求相关的任务(会导致错误或无效)。
  • @MIkCode 还要注意 AppEngine 在请求处理程序返回之前不会将任何数据发送回客户端。请求处理程序写入的数据首先写入缓冲区,处理程序返回后才将数据发送给用户。
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2012-06-13
  • 1970-01-01
  • 2022-11-13
  • 2020-07-25
  • 2015-06-01
相关资源
最近更新 更多