国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - golang中為什么Response.Body需要被關閉詳解

golang中為什么Response.Body需要被關閉詳解

2020-05-19 09:29一桶冷水 Golang

這篇文章主要給大家介紹了關于golang中為什么Response.Body需要被關閉的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

本文主要介紹了關于golang中Response.Body需要被關閉的相關內(nèi)容,文中通過示例代碼介紹的非常詳細,對各位學習或者使用golang具有一定參考學習價值,下面話不多說了,來一起看看詳細的介紹吧

Body io.ReadCloser

The http Client and Transport guarantee that Body is always non-nil, even on
responses without a body or responses with a zero-length body. It is the caller's
responsibility to close Body. The default HTTP client's Transport does not attempt to
reuse HTTP/1.0 or HTTP/1.1 TCP connections ("keep-alive") unless the Body is read to
completion and is closed.

http客戶端(Client)和傳輸(Transport)保證響應體總是非空的,即使響應沒有響應體或0長響應
體。關閉響應體是調(diào)用者的責任。默認http客戶端傳輸(Transport)不會嘗試復用keep-alive的
http/1.0、http/1.1連接,除非請求體已被完全讀出而且被關閉了。

以上是http包文檔說明。但是為什么body需要被關閉呢,不關閉會如何?那就讀源碼唄。

要了解body,首先要了解http事務是如何處理的。http事務是交由底層的Transport處理的。

第一步是從連接池獲取一個連接,這個連接的功能由3個goroutine協(xié)同實現(xiàn),一個主goroutine,一個readLoop,一個writeLoop,后兩個goroutine生命周期和連接一致。雖說readLoop和writeLoop名字叫循環(huán)(也確實是for循環(huán)),但實際上一次循環(huán)就完整處理一個http事務,循環(huán)本身僅僅是為了連接復用,所以為了便于理解其邏輯可以忽略它的循環(huán)結(jié)構(gòu)。

接下來三個goroutine協(xié)同完成http事務:

  • 主goroutine將request同時發(fā)給readLoop和writeLoop。
  • writeLoop發(fā)送request,然后將狀態(tài)(error)發(fā)送給主goroutine和readLoop。
  • readLoop解析頭部response,然后將狀態(tài)(error)和response發(fā)送給主goroutine。
  • 主goroutine返回用戶代碼,readLoop等待body讀取完成。
  • readLoop回收連接。

了解http事務的處理流程,然后我們回過頭來看看神秘的body到底是什么

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//源碼版本1.8.3
// src/net/http/transfer.go:405 body解析方法
func readTransfer(msg interface{}, r *bufio.Reader) (err error)
 
// src/net/http/transfer.go:485 解析chunked
t.Body = &body{src: internal.NewChunkedReader(r), hdr: msg, r: r, closing: t.Close}
 
// src/net/http/transfer.go:490 產(chǎn)生eof
t.Body = &body{src: io.LimitReader(r, realLength), closing: t.Close}
 
// src/net/http/transport.go:1560 發(fā)送eof信號
body := &bodyEOFSignal{
 
// src/net/http/transport.go:1583 gzip解碼
resp.Body = &gzipReader{body: body}

body實際上是一個嵌套了多層的net.TCPConn:

  • bufio.Reader,這層嘗試將多次小的讀操作替換為一次大的讀操作,減少系統(tǒng)調(diào)用的次數(shù),提高性能;
  • io.LimitedReader,tcp連接在讀取完body后不會關閉,繼續(xù)讀會導致阻塞,所以需要LimitedReader在body讀完后發(fā)出eof終止讀取;
  • chunkedReader,解析chunked格式編碼(如果不是chunked略過);
  • bodyEOFSignal,在讀到eof,或者是提前關閉body時會對readLoop發(fā)出回收連接的通知;
  • gzipReader,解析gzip壓縮(如果不是gizp壓縮略過);

從上面可以看出如果body既沒有被完全讀取,也沒有被關閉,那么這次http事務就沒有完成,除非連接因超時終止了,否則相關資源無法被回收。

如果請求頭或響應頭指明Connection: close呢?還是無法回收,因為close表示在http事務完成后斷開連接,而事務尚未完成自然不會斷開,更不會回收。

從實現(xiàn)上看只要body被讀完,連接就能被回收,只有需要拋棄body時才需要close,似乎不關閉也可以。但那些正常情況能讀完的body,即第一種情況,在出現(xiàn)錯誤時就不會被讀完,即轉(zhuǎn)為第二種情況。而分情況處理則增加了維護者的心智負擔,所以始終close body是最佳選擇。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://www.jianshu.com/p/407fada3cc9d

延伸 · 閱讀

精彩推薦
  • GolangGolang通脈之數(shù)據(jù)類型詳情

    Golang通脈之數(shù)據(jù)類型詳情

    這篇文章主要介紹了Golang通脈之數(shù)據(jù)類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語言中標識符允許由...

    4272021-11-24
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggo日志系統(tǒng)logrus顯示文件和行號的操作

    go日志系統(tǒng)logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • GolangGolang中Bit數(shù)組的實現(xiàn)方式

    Golang中Bit數(shù)組的實現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優(yōu)雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網(wǎng)11352020-05-21
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产日韩欧美 | 夜久久| 欧美一区二区三区视频在线观看 | 免费一级毛片观看 | 久久精品亚洲一区二区 | 成人午夜网 | 亚洲欧美激情精品一区二区 | 国产一级片 | 日日鲁鲁| 亚洲福利社区 | 精品综合久久久 | 亚洲成人精品在线 | 免费a级毛片大学生免费观看 | 久久99精品久久久久 | 福利久久| 91久久久久久久久 | 一区二区三区国产视频 | 中文字幕av亚洲精品一部二部 | 91精品在线看 | 一区二区三区在线播放 | 成人精品一区二区三区 | 91视频国产精品 | 91亚洲成人 | 久久国产精品无码网站 | 久久国产精品视频 | aaa欧美大片 | 日韩视频久久 | 国产精品久久久久久久久久久久冷 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲免费观看视频网站 | 国产91久久精品一区二区 | 成人午夜视频免费 | 欧美一区二区在线刺激视频 | 成人免费在线播放 | 一级片网 | 欧美久久久久 | 久久国产亚洲精品 | 精品久久久久久久人人人人传媒 | 91在线精品一区二区 | 色爱av| 欧洲成人午夜免费大片 |