登录
首页 >  Golang >  Go问答

为何导致了这种结果的情况发生?

来源:stackoverflow

时间:2024-02-28 22:36:24 330浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《为何导致了这种结果的情况发生?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我编写了一个golang脚本来扫描开放端口并使用sync.waitgourp来控制goroutines的数量。

当goroutine太大时,比如2000,结果与1000不同。

类似于提前退出。代码如下所示

func worker(wg *sync.WaitGroup) {
    for job := range jobs {
        _, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", job.host, job.port), time.Millisecond*1500)
        if err != nil {
            results <- Result{job, false}
        } else {
            results <- Result{job, true}
        }
    }
    wg.Done()
}

func main() {
    go func() {
        for i := 1; i < 65535; i++ {
            jobs <- Job{host, i}
        }
        close(jobs)
    }()

    go func() {
        for result := range results {
            if result.status {
                fmt.Println(result.job, "open")
            }
        }
    }()

    wg := sync.WaitGroup{}
    for i := 1; i < 1000; i++ {
        wg.Add(1)
        go worker(&wg)
    }
    wg.Wait()
}

1000 时

{127.0.0.1 80} 打开 {127.0.0.1 631} 打开 {127.0.0.1 3306} 打开 {127.0.0.1 6379} 打开 {127.0.0.1 33060} 打开

2000年

{127.0.0.1 80} 打开 {127.0.0.1 631} 打开

我想要 2000 输出像 1000 这样的所有端口


解决方案


工作人员完成后关闭结果通道。在主 goroutine 中处理结果。

wg := sync.WaitGroup{}
for i := 1; i < 1000; i++ {
    wg.Add(1)
    go worker(&wg)
}

go func() {
    for i := 1; i < 65535; i++ {
        jobs <- Job{host, i}
    }

    // No more jobs, exit from worker loops.
    close(jobs)

    // Wait for workers to write all results and exit.
    wg.Wait()

    // No more results, exit from main loop.
    close(results)

}()

for result := range results {
    if result.status {
        fmt.Println(result.job, "open")
    }
}

View the complete program on the GoLang PlayGround.

您不会等待 main 中的两个“非工作”goroutine,因此一旦 wg.wait() 返回,进程就会关闭,并销毁任何未完成的任务协程。

由于其中一个正在处理结果,因此在您看来,好像并非所有任务都已处理(这是事实)。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

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