2015-05-21 30 views
2

我正在使用雲端點,並且我試圖通過使用goroutine以異步方式調用方法。如何在AppEngine內部使用goroutine?

當我在本地運行下面的代碼時,我可以看到調試打印,但在服務器上它看起來像方法沒有被調用。

基本上,我試圖做

go doStuff() 

return type 
+0

你能提供有關您的代碼的更多細節?根據[docs](https://cloud.google.com/appengine/docs/go/),*「App Engine的Go運行時環境全面支持goroutines,但不支持並行執行」*。從文檔不清楚,但[託管虛擬機](https://cloud.google.com/appengine/docs/go/managed-vms/)可能沒有相同的限制。 – tx802

回答

2

Go運行時應用服務引擎支持夠程,從文檔報價:Go Runtime Environment: Introduction

App Engine的Go運行時環境提供全面支持goroutines,但不適用於並行執行:goroutines被安排在單個操作系統線程上。

的問題是,當你的HandleFunc()Handler.ServeHTTP()返回時,應用服務引擎平臺(和http包過)不等待由處理函數開始完成任何夠程。

從文檔報價:Handling Requests: Responses

App Engine的調用與RequestResponseWriter處理程序,然後等待處理程序寫入ResponseWriter和回報。處理程序返回時,ResponseWriter的內部緩衝區中的數據將發送給用戶。

必須同步您的請求處理和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 
} 
+0

所以基本上我必須阻止goroutine? 我該怎麼做才能避免阻塞 – MIkCode

+1

@MIkCode不,您必須阻止請求處理程序,直到goroutine完成(而不是其他方式)。當請求處理程序返回時,這就結束了。 – icza

+0

即時通訊只是想知道如果他們的任何選項在goroutine結束之前返回用戶響應? – MIkCode