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

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

多閱讀器的并發(fā) POST 不返回響應(yīng)

多閱讀器的并發(fā) POST 不返回響應(yīng)

Go
撒科打諢 2023-03-21 17:02:42
我有一個(gè)使用echo的概念驗(yàn)證 http 服務(wù)器,它接受帶有 JSON 正文的 POST 請求。我正在嘗試使用管道和多寫入器將請求主體流式傳輸?shù)蕉鄠€(gè) POST 請求,但它無法正常工作。在下面的示例中,我可以看到數(shù)據(jù)被發(fā)送到 2 個(gè) POST 端點(diǎn),我可以看到來自這些請求的日志,但我從未收到回復(fù),似乎代碼掛起等待功能完成http.Post(...)。如果我直接調(diào)用這兩個(gè)端點(diǎn),它們可以正常工作并給出有效的 json 響應(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)    <-done    <-done    return c.String(200, "Imported")}控制臺中的輸出是:Product StartingImport Starting
查看完整描述

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ò)誤。


查看完整回答
反對 回復(fù) 2023-03-21
  • 1 回答
  • 0 關(guān)注
  • 97 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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