1 回答

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
OP 代碼中的問題是 http.Post 調(diào)用從不檢測所提供的 io.Reader 的 EOF。
發(fā)生這種情況是因?yàn)樘峁┑陌雽懝艿烙肋h(yuǎn)不會關(guān)閉,因此,半讀管道永遠(yuǎn)不會發(fā)出常規(guī)的 EOF 錯(cuò)誤。
作為關(guān)于關(guān)閉半讀管道會產(chǎn)生不規(guī)則錯(cuò)誤的 OP 評論的注釋,必須了解從關(guān)閉的管道讀取不是正確的行為。
因此在這種情況下,應(yīng)注意在復(fù)制完內(nèi)容后立即關(guān)閉半寫側(cè)。
生成的源代碼應(yīng)更改為
func ImportAggregate(c echo.Context) error {
oneR, oneW := io.Pipe()
twoR, twoW := io.Pipe()
done := make(chan bool, 2)
go func() {
fmt.Println("Product Starting")
response, err := http.Post("http://localhost:1323/products/import", "application/json", oneR)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(response.Body)
}
done <- true
}()
go func() {
fmt.Println("Import Starting")
response, err := http.Post("http://localhost:1323/discounts/import", "application/json", twoR)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(response.Body)
}
done <- true
}()
mw := io.MultiWriter(oneW, twoW)
io.Copy(mw, c.Request().Body)
oneW.Close()
twoW.Close()
<-done
<-done
return c.String(200, "Imported")
}
OP 問題之外的旁注:
必須圍繞 io.Copy 實(shí)施錯(cuò)誤檢查以檢測傳輸錯(cuò)誤。
不需要關(guān)閉管道的半讀端,http.Post 將在收到 EOF 信號后執(zhí)行此操作。
必須在復(fù)制輸入請求之前聲明并啟動負(fù)責(zé)使用管道的 goroutine。Pipes 是同步的,代碼會在 io.Copy 等待另一端被消耗的過程中阻塞。
done chan 不需要無緩沖(長度為 2)
一種將錯(cuò)誤從傳出請求轉(zhuǎn)發(fā)到傳出響應(yīng)的方法是使用 type 的通道
(chan error)
,循環(huán)兩次,并檢查遇到的第一個(gè)錯(cuò)誤。
- 1 回答
- 0 關(guān)注
- 97 瀏覽
添加回答
舉報(bào)