duanpi2033
duanpi2033
2015-05-21 09:24
浏览 29
已采纳

如何在AppEngine中使用goroutine?

I'm using Cloud Endpoints and Go and I'm trying to call a method in asynchronous way by using a goroutine.

When I'm running the following code locally I can see the debug prints but on the server it looks like the method did not get called.

I'm basically trying to do

go doStuff()

return type 

图片转代码服务由CSDN问答提供 功能建议

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

当我在本地运行以下代码时,我可以看到调试打印,但是在服务器上好像没有调用该方法。 < p>我基本上是在尝试

  go doStuff()
 
返回类型
   
 
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • duanmen8491
    duanmen8491 2015-05-21 10:33
    已采纳

    The Go runtime for AppEngine supports goroutines, quoting from the doc: Go Runtime Environment: Introduction:

    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.

    The problem is that when your HandleFunc() or Handler.ServeHTTP() returns, the AppEngine platform (and the http package too) does not wait for any goroutines started by the handler function to complete.

    Quoting from the doc: Handling Requests: Responses:

    App Engine calls the handler with a Request and a ResponseWriter, then waits for the handler to write to the ResponseWriter and return. When the handler returns, the data in the ResponseWriter's internal buffer is sent to the user.

    You have to synchronize your request handling and goroutine, and only return once the goroutine has completed its work, for example:

    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
    }
    
    点赞 评论

相关推荐