2 回答

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
為每個(gè) http 請(qǐng)求提供服務(wù)在其自己的 goroutine 中運(yùn)行(更多詳細(xì)信息)。您可以從您的處理程序啟動(dòng)新的 goroutine,它們將同時(shí)運(yùn)行,獨(dú)立于執(zhí)行處理程序的 goroutine。
需要注意的一些事項(xiàng):
新的 goroutine 獨(dú)立于處理程序 goroutine 運(yùn)行。這意味著它可能在處理程序 goroutine 之前或之后完成,如果沒(méi)有顯式同步,您不能(不應(yīng)該)假設(shè)與此有關(guān)的任何事情。
處理程序的http.ResponseWriter和http.Request參數(shù)僅在處理程序返回之前有效且安全使用!這些值(或它們的“部分”)可以重復(fù)使用 - 這是一個(gè)實(shí)現(xiàn)細(xì)節(jié),您也不應(yīng)該對(duì)其進(jìn)行任何假設(shè)。一旦處理程序返回,您不應(yīng)該觸摸(甚至不讀取)這些值。
一旦處理程序返回,響應(yīng)就會(huì)被提交(或者可能隨時(shí)提交)。這意味著您的新 goroutine 不應(yīng)嘗試使用http.ResponseWriterafter this 發(fā)回任何數(shù)據(jù)。這在某種程度上是正確的,即使您不觸摸http.ResponseWriter處理程序中的 ,處理程序的不恐慌也被視為成功處理請(qǐng)求,因此返回 HTTP 200 狀態(tài)(參見(jiàn)示例)。
您可以將http.Requestandhttp.ResponseWriter值傳遞給其他函數(shù)和新的 goroutine,但必須注意:如果您打算從多個(gè) goroutine 讀取/修改這些值(或者您想要從多個(gè) goroutine 發(fā)回?cái)?shù)據(jù))。
請(qǐng)注意,如果您的處理程序 goroutine 和新的 goroutine 都只是讀取/檢查http.Request,這似乎仍然可能是有問(wèn)題的。是的,多個(gè) goroutine 可以在不同步的情況下讀取同一個(gè)變量(如果沒(méi)有人修改它)。但是調(diào)用 的某些方法http.Request也會(huì)修改http.Request,如果沒(méi)有同步,就不能保證其他 goroutine 會(huì)從這個(gè)變化中看到什么。例如Request.FormValue(),返回與給定鍵關(guān)聯(lián)的表單值。但是這個(gè)方法調(diào)用ParseMultiPartForm()并ParseForm()在必要時(shí)對(duì)其進(jìn)行修改http.Request(例如,他們?cè)O(shè)置了Request.PostForm和Request.Form結(jié)構(gòu)字段)。
因此,除非您同步您的 goroutine,否則您不應(yīng)將Requestand傳遞ResponseWriter給新的 goroutine,而是從Request處理程序 goroutine 中獲取所需的數(shù)據(jù),并僅傳遞例如struct保存所需數(shù)據(jù)的 a。
你的第二個(gè)例子:
foo := int64(0)
bar := func() {
// do slow things with foo
}
go bar()
這很好。這是一個(gè)閉包,它所引用的局部變量只要可訪問(wèn),就會(huì)繼續(xù)存在。
請(qǐng)注意,您也可以將局部變量的值作為參數(shù)傳遞給匿名函數(shù)調(diào)用,如下所示:
foo := int64(0)
bar := func(foo int64) {
// do slow things with param foo (not the local foo var)
}
go bar(foo)
在這個(gè)例子中,匿名函數(shù)將看到并使用它的參數(shù)foo而不是局部變量foo。這可能是您想要的,也可能不是您想要的(取決于處理程序是否也使用foo以及是否需要任何 goroutine 所做的更改對(duì)另一個(gè)可見(jiàn) - 但這無(wú)論如何都需要同步,這將被通道解決方案取代)。

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您關(guān)心郵件的確認(rèn),那么發(fā)布的代碼將無(wú)濟(jì)于事。在單獨(dú)的 goroutine 中運(yùn)行代碼使其獨(dú)立,即使由于 goroutine 函數(shù)中的某些錯(cuò)誤導(dǎo)致郵件未發(fā)送,服務(wù)器也會(huì)回復(fù)成功。
- 2 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報(bào)