EasyDSS/EasyNTS通過Golang使用http如何優化響應body未關閉的問題?
阿新 • • 發佈:2021-06-16
我們大多數平臺都是用的Golang進行編譯的,在很多視訊流媒體軟體比如EasyDSS、EasyNTS等產品的編譯中,經常會出現要使用http介面訪問其他服務的介面的情況,一般的程式設計程式碼如下:
// 獲取 url 資料 func getUrl(url string) ([]byte, error) { client := http.Client{ Timeout: 5 * time.Second, } resp, err := client.Get(url) if err != nil { return nil, fmt.Errorf("get url %s error : %s", url, err.Error()) } body, err := ioutil.ReadAll(resp.Body) if err != nil { err = fmt.Errorf("get url %s readbody error %s", url, err.Error()) return nil, err } return body, nil }
近期在複查部分產品程式碼中,發現部分人員寫的程式碼基本為以上類似程式碼,其中有個非常需要注意的問題,即沒有將對應的響應Body關閉,短期不關閉程式碼不會出現什麼問題,但是該種程式碼會讓記憶體持續增高,導致系統資源的利用率降低。
為了優化這一問題,我們需要新增以下程式碼:
defer resp.Body.Close() 完整程式碼如下 // 獲取 url 資料 func getUrl(url string) ([]byte, error) { client := http.Client{ Timeout: 5 * time.Second, } resp, err := client.Get(url) if err != nil { return nil, fmt.Errorf("get url %s error : %s", url, err.Error()) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { err = fmt.Errorf("get url %s readbody error %s", url, err.Error()) return nil, err } return body, nil }
該程式碼在原本程式碼上做了優化,進一步適應了使用者的使用,節約系統記憶體資源,如果大家後期在編譯中有此類需求,也可以參考以上程式碼做優化和調整。針對EasyDSS和EasyNTS的新功能開發或者編譯,我們也將不斷更新。如若還需瞭解更多TSINGSEE青犀視訊相關視訊雲服務或者其他編譯相關內容,歡迎關注。