亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Go 中 HTTP ResponseWriter 的寫函數會緩沖嗎?

Go 中 HTTP ResponseWriter 的寫函數會緩沖嗎?

Go
楊__羊羊 2021-08-16 19:57:32
假設我們有一個處理 HTTP 請求的函數,例如:func handler(w http.ResponseWriter,  r *http.Request) {    w.Write([]byte("first piece of data"))    // do something    w.Write([]byte("second piece of data"))}  我想知道第一次調用 w.Write() 是否刷新到客戶端?如果它被刷新,那么我們實際上對客戶端響應了兩次,這很奇怪,因為我們如何Content-Length在第二次調用 write 之前確定?如果它沒有被刷新(比如數據在本地緩沖),那么如果我們在第一次調用時寫入大量數據怎么辦?(那個堆棧會溢出嗎?)
查看完整描述

1 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

我想知道第一次調用 w.Write() 是否刷新到客戶端?

net/http的默認值ResonseWriternet.Conn它寫入的內容上有一個(當前為 4KB)大的輸出緩沖區。此外,操作系統通常會緩沖對套接字的寫入。所以在大多數情況下會發生某種緩沖。

如果它被刷新,那么我們實際上對客戶端響應了兩次,這很奇怪,因為我們如何在第二次調用 write 之前確定 Content-Length?

好吧,HTTP 1.1 允許持久連接。此類響應通常不包含Content-Length標題。此外,還有 HTTP 預告片。

如果您的客戶端不支持 HTTP 1.1 和持久連接,它們將有某種讀取超時,在此期間您可以根據需要多次寫入連接;這是一種回應。

與 Go 相比,這更多地與 TCP 套接字和 HTTP 實現的性質有關。

如果它沒有被刷新(比如數據在本地緩沖),那么如果我們在第一次調用時寫入大量數據怎么辦?(那個堆棧會溢出嗎?)

不,在堆棧上分配緩沖區是沒有意義的——緩沖區的主體將存在于堆中。如果您達到每個進程的內存限制,您的應用程序將出現“內存不足”的恐慌。


查看完整回答
反對 回復 2021-08-16
  • 1 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號