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

huangapple go评论86阅读模式
英文:

Can I use Goroutines in Google App Engine (Standard Environment)?

问题

以下示例似乎可以工作,但使用它是否安全?我的目标是进行一些非常轻量级的后台处理(而实际的任务队列作业感觉太重)。

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

  go func() {
    // 做一些事情...
  }() 

  return // 200
}

这段代码的作用是在处理HTTP请求时,启动一个匿名的goroutine来执行一些后台处理任务。它使用了Go语言的并发特性,通过go关键字将任务放入一个新的goroutine中并立即返回响应(状态码200)。这样可以避免阻塞主线程,使得处理请求的函数能够快速返回。

然而,需要注意的是,这种方式可能存在一些潜在的安全问题。由于goroutine是并发执行的,它们可能会与主线程同时访问和修改共享的资源,导致竞态条件和数据竞争。因此,在使用goroutine时,需要确保正确地同步和保护共享资源,以避免潜在的问题。

另外,还需要注意goroutine的生命周期管理。在这个示例中,匿名的goroutine没有被显式地结束,它将在任务完成后自动退出。但在实际应用中,如果goroutine的生命周期不受控制,可能会导致资源泄漏或意外的行为。

综上所述,虽然这种轻量级的后台处理方式在某些情况下是安全可行的,但在使用时需要注意并发安全和生命周期管理的问题。

英文:

The following example seems to work, but is it safe to use? My goal is to do some very light background processing (whereas an actual task queue job feels too heavy).

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

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

  return // 200
}

答案1

得分: 7

Goroutines that outlive the request are not supported, but you can use runtime.RunInBackground to execute code in a background goroutine:

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

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

  return // 200
}

提供的函数将使用与提供的上下文不同且可能比其更长寿的后台上下文调用。请注意,每个实例最多可以同时处理10个后台请求。这里是另一个示例

请注意,Goroutines 在请求的上下文中存在 是受支持的:

> App Engine的Go运行时环境完全支持goroutines,但不支持并行执行:goroutines被调度到单个操作系统线程上。这个单线程限制可能在将来的版本中被解除。给定实例可以同时处理多个请求;这意味着如果一个请求正在等待数据存储API调用,另一个请求可以由同一实例处理。(来源)

英文:

Goroutines that outlive the request are not supported, but you can use runtime.RunInBackground to execute code in a background goroutine:

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

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

  return // 200
}

The provided function will be invoked with a background context that is distinct from (and may outlast) the provided context. Note that there is a limit of 10 simultaneous background requests per instance. Here is another example.

Please note that Goroutines that live within the context of a request, are supported though:

> The Go runtime environment for App Engine provides full support for
> goroutines, but not for parallel execution: goroutines are scheduled
> onto a single operating system thread. This single-thread restriction
> may be lifted in future versions. Multiple requests may be handled
> concurrently by a given instance; that means that if one request is,
> say, waiting for a datastore API call, another request may be
> processed by the same instance. (Source)

huangapple
  • 本文由 发表于 2014年11月28日 17:22:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/27185405.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定