我能在Google App Engine(标准环境)中使用Goroutines吗?

8
以下示例似乎可以工作,但使用它是否安全?我的目标是执行一些轻量级后台处理(而实际任务队列工作感觉太重)。
func MyHandler(w http.ResponseWriter, r *http.Request) {

  go func() {
    // do something ...
  }() 

  return // 200
}

这个线程可能会引起兴趣:https://groups.google.com/forum/#!topic/google-appengine-go/fv1BgRHcH_M - Greg
1个回答

7

不支持超出请求生命周期的 Goroutines,但是您可以使用 runtime.RunInBackground 在后台 Goroutine 中执行代码:

func MyHandler(w http.ResponseWriter, r *http.Request) {

  err := runtime.RunInBackground(c, func(c appengine.Context) {
    // do something...
  })

  return // 200
}

提供的函数将使用与所提供的上下文不同(并可能超出)的后台上下文调用。请注意,每个实例最多可以同时处理10个后台请求。这里是另一个示例
请注意,生存在请求上下文中的Goroutines得到支持:
引擎的Go运行时环境完全支持goroutine,但不支持并行执行:goroutine被安排在单个操作系统线程上。这个单线程限制可能在未来版本中被取消。给定实例可以同时处理多个请求;这意味着如果一个请求正在等待数据存储API调用,那么同一实例可能会处理另一个请求。(

1
根据这里,你所说的似乎是错误的。我漏掉了什么吗? - Stephan Dollberg
1
你可以使用 goroutines。要访问 appengine 服务,你需要后台上下文,可以通过调用 appengine.RunInBackground 来获取(仍然可用)。 - Alex Dvoretsky
2
@divan,迁移到Google App Engine的go112后,应该采取什么方法来完成这个任务? - Gaurav Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接