以下示例似乎有效,但使用安全吗?我的目标是做一些非常简单的后台处理(而实际的任务队列工作感觉太重)。
func MyHandler(w http.ResponseWriter, r *http.Request) {
go func() {
// do something ...
}()
return // 200
}
答案 0 :(得分: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个。这是another example。
请注意,生活在请求的上下文中的Goroutines支持:
App Engine的Go运行时环境提供全面支持 goroutines,但不是并行执行:goroutines被安排 到一个操作系统线程上。这个单线程限制 可能会在未来的版本中解除。可以处理多个请求 同时由一个给定的实例;这意味着如果有一个请求, 比方说,等待数据存储区API调用,可能是另一个请求 由同一个实例处理。 (Source)
答案 1 :(得分:-2)
请记住,伙计们,并发和并行操作之间存在着天壤之别。这困扰了我一段时间(有时仍然)。看看Rob Pike说的话:https://www.youtube.com/watch?v=oV9rvDllKEg
换句话说,是的,AppEngine可以处理goroutines - 这不是并行的。这是以最有效的方式运行代码,并且是能够并行运行代码的前提......