假設我們有一個處理 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
的默認值ResonseWriter
在net.Conn
它寫入的內容上有一個(當前為 4KB)大的輸出緩沖區。此外,操作系統通常會緩沖對套接字的寫入。所以在大多數情況下會發生某種緩沖。
如果它被刷新,那么我們實際上對客戶端響應了兩次,這很奇怪,因為我們如何在第二次調用 write 之前確定 Content-Length?
好吧,HTTP 1.1 允許持久連接。此類響應通常不包含Content-Length
標題。此外,還有 HTTP 預告片。
如果您的客戶端不支持 HTTP 1.1 和持久連接,它們將有某種讀取超時,在此期間您可以根據需要多次寫入連接;這是一種回應。
與 Go 相比,這更多地與 TCP 套接字和 HTTP 實現的性質有關。
如果它沒有被刷新(比如數據在本地緩沖),那么如果我們在第一次調用時寫入大量數據怎么辦?(那個堆棧會溢出嗎?)
不,在堆棧上分配緩沖區是沒有意義的——緩沖區的主體將存在于堆中。如果您達到每個進程的內存限制,您的應用程序將出現“內存不足”的恐慌。
- 1 回答
- 0 關注
- 181 瀏覽
添加回答
舉報
0/150
提交
取消