2 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊
您正在為每個(gè) go 例程創(chuàng)建一個(gè) http 客戶(hù)端。
Http 客戶(hù)端被設(shè)計(jì)為一次創(chuàng)建并多次使用。它們是日常安全的。它們?cè)试S連接重用和其他效率節(jié)省。
在 main 中(而不是在您的 go 例程中)創(chuàng)建一次 http 客戶(hù)端,然后將此單個(gè)引用傳遞給您的所有 50 個(gè) go 例程。
編輯:此外,雖然它可能不會(huì)對(duì)您的情況產(chǎn)生實(shí)際影響,但請(qǐng)求的順序通常如下所示:
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的垃圾收集不是即時(shí)的 - 也不應(yīng)該是 - 因?yàn)樗且豁?xiàng)昂貴的操作。如果您不再需要某個(gè)內(nèi)存塊 - 只需不再引用它即可。讓 GC 完成它的工作,這樣您就可以專(zhuān)注于您的工作!

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