bugfix> http > 投稿

更新されたコード

こんにちは、httpClientでメモリリークがあります。sync.WaitGroupを追加しましたが、httpClientのゴルーチンが閉じないことがわかりました。修正方法

func checkProxySOCKS(prox string, c chan QR, wg *sync.WaitGroup) (err error) {
defer wg.Done()
dialer, _ := proxy.SOCKS5("tcp", prox, nil, proxy.Direct)
timeout := time.Duration(2 * time.Second)
httpClient := &http.Client{
    Timeout: timeout,
    Transport: &http.Transport{
        DisableKeepAlives: true,
        Dial:              dialer.Dial,
    },
}
res, err := httpClient.Get("https://telegram.org/")
if err != nil {
    c <- QR{Addr: prox, Res: false}
    return
}
defer res.Body.Close()
io.Copy(ioutil.Discard, res.Body)
c <- QR{Addr: prox, Res: true}
return nil

} ここでゴルーチンを作成します

for _, proxy := range splitedProxies {
    wg.Add(1)
    go checkProxySOCKS(proxy, respChan, &wg)
}
for range splitedProxies {
    wg.Add(1)
    r := <-respChan
    if r.Res {
        checkedProxiesArray = append(checkedProxiesArray, r.Addr)
    }
    wg.Done()
}
wg.Wait()

回答 1 件
  • 私はコメントを読んでいるので、これはあなたの問題を解決するはずです

    const (
        timeout = time.Duration(1000 * time.Millisecond)
        tt      = time.Duration(100 * time.Millisecond)
    )
    func checkProxySOCKS(prox string, c chan QR, wg *sync.WaitGroup) (err error) {
        defer wg.Done()
        d := net.Dialer{
            Timeout:   tt,
            KeepAlive: tt,
        }
        dialer, _ := proxy.SOCKS5("tcp", prox, nil, &d)
        httpClient := &http.Client{
            Timeout: timeout,
            Transport: &http.Transport{
                DisableKeepAlives: true,
                Dial:              dialer.Dial,
            },
        }
        res, err := httpClient.Get("https://telegram.org/")
        if err != nil {
            c <- QR{Addr: prox, Res: false}
            return
        }
        defer res.Body.Close()
        io.Copy(ioutil.Discard, res.Body)
        c <- QR{Addr: prox, Res: true}
        return nil
    }
    
    

あなたの答え