2 回答

TA貢獻1827條經驗 獲得超4個贊
您正在為每個 go 例程創建一個 http 客戶端。
Http 客戶端被設計為一次創建并多次使用。它們是日常安全的。它們允許連接重用和其他效率節省。
在 main 中(而不是在您的 go 例程中)創建一次 http 客戶端,然后將此單個引用傳遞給您的所有 50 個 go 例程。
編輯:此外,雖然它可能不會對您的情況產生實際影響,但請求的順序通常如下所示:
resp, err := httpClient.Do(req)
if err != nil {
? ? ? ? return err // check error first
}
defer resp.Body.Close() // no error - so resp will *NOT* be nil - so this is safe
編輯2:正如@Adrian所提到的:go的垃圾收集不是即時的 - 也不應該是 - 因為它是一項昂貴的操作。如果您不再需要某個內存塊 - 只需不再引用它即可。讓 GC 完成它的工作,這樣您就可以專注于您的工作!

TA貢獻1827條經驗 獲得超9個贊
?for i := 0; i < 50; i++ {
? ? ? ? go func() {
? ? ? ? ? ? DoRequest()
? ? ? ? }()
? ? ? ? time.Sleep(10 * time.Millisecond)
? ? }
切勿創建這樣的 go 例程。始終確保您創建 go 例程的方式在任何情況下(包括最壞的情況)都不會填充大量(所有)內存
簡單的解決方案是控制一次可以生成(或運行)的 go 例程的數量。
您可以通過乘以一次要運行的 go 例程的 max-number 來預先計算最壞情況下要占用的內存,并且 max-memory 可以被一個 go 例程使用。
- 2 回答
- 0 關注
- 182 瀏覽
添加回答
舉報