第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Webhook 進(jìn)程在另一個(gè) goroutine 上運(yùn)行

Webhook 進(jìn)程在另一個(gè) goroutine 上運(yùn)行

Go
SMILET 2022-01-17 18:04:51
我想在另一個(gè) goroutine 中運(yùn)行一些緩慢的例程,這樣做是否安全:func someHandler(w http.ResponseWriter, r *http.Request) {   go someReallySlowFunction() // sending mail or something slow   fmt.Fprintf(w,"Mail will be delivered shortly..")}func otherHandler(w http.ResponseWriter, r *http.Request) {   foo := int64(0)   bar := func() {      // do slow things with foo   }   go bar()   fmt.Fprintf(w,"Mail will be delivered shortly..")}這樣做有什么問(wèn)題嗎?
查看完整描述

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ú)論如何都需要同步,這將被通道解決方案取代)。


查看完整回答
反對(duì) 回復(fù) 2022-01-17
?
隔江千里

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ù)成功。


查看完整回答
反對(duì) 回復(fù) 2022-01-17
  • 2 回答
  • 0 關(guān)注
  • 127 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)