登录
首页 >  Golang >  Go问答

一段时间后 Goroutines 就挂了

来源:stackoverflow

时间:2024-04-07 22:45:29 247浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《一段时间后 Goroutines 就挂了》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我正在编写一个程序来检查我的 socks5 代理。我的方法是迭代代理数组中的每个元素,并为每个代理创建一个 goroutine,程序运行得很完美,但是,过了一会儿(运行程序后大约 10 秒),我的程序将停止很长一段时间时间并且不执行任何操作,即使它尚未完成检查代理列表。我现在该怎么办?这是我的代码:

func checkProxy(proxyAddress string, timeout time.Duration, sw *sync.WaitGroup, sm *sync.Mutex) {
    retry := 0
    headers := []byte("GET / HTTP/1.1\r\nHost: " + PROXY_JUDGE_HOST + "\r\n\r\n")
    for {
        if retry == 3 {
            break
        }
        conn, err := SocksClient(proxyAddress, PROXY_JUDGE_ADDRESS, timeout)
        if err != nil {
            retry++
            return
        }
        func(netConn net.Conn) {
            defer netConn.Close()
            if _, err = conn.Write(headers); err != nil {
                return
            }
        }(conn)
        break
    }
    fmt.Println("Found GOOD proxies: " + proxyAddress)
    sm.Lock()
    liveProxies = append(liveProxies, proxyAddress)
    sm.Unlock()
    sw.Done()
}

func main() {
    var sw sync.WaitGroup
    var sm sync.Mutex
    totalProxies = readFile("socks5.txt")
    for i := 0; i < len(totalProxies); i++ {
        sw.Add(1)
        go checkProxy(totalProxies[i], 1*time.Second, &sw, &sm)
    }
    sw.Wait()
    // Code to add proxies list to the new file
}

正确答案


在您的代码中,函数在递减sync.waitgroup 上的计数器之前返回一条路径:

func checkproxy(....) {
    for {
    ....
        if err != nil {
            retry++
            return
        }
    }

}

我猜你的意思是在那里添加一个 continue 。如果出现错误,则 sw.done() 调用将永远不会执行,因为该函数之前返回。

作为最佳实践,请确保推迟 sw.done 调用,以便在任何退出路径上调用它。

func checkProxy(..., sw *sync.WaitGroup, ...) {
   defer sw.Done() // decrement once goroutine is done.
}

今天关于《一段时间后 Goroutines 就挂了》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>