为什么会有这样的结果?

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


当 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


肥皂起泡泡
浏览 110回答 2
2回答

泛舟湖上清波郎朗

您无需等待 中的两个“非工作”goroutine&nbsp;main,因此一旦wg.Wait()返回,进程就会关闭,并拆除所有未完成的 goroutine。由于其中一个正在处理结果,因此在您看来,好像并非所有任务都已处理(这是真的)。

慕的地6264312

工作人员完成后关闭结果通道。在主 goroutine 中处理结果。wg := sync.WaitGroup{}for i := 1; i < 1000; i++ {&nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; go worker(&wg)}go func() {&nbsp; &nbsp; for i := 1; i < 65535; i++ {&nbsp; &nbsp; &nbsp; &nbsp; jobs <- Job{host, i}&nbsp; &nbsp; }&nbsp; &nbsp; // No more jobs, exit from worker loops.&nbsp; &nbsp; close(jobs)&nbsp; &nbsp; // Wait for workers to write all results and exit.&nbsp; &nbsp; wg.Wait()&nbsp; &nbsp; // No more results, exit from main loop.&nbsp; &nbsp; close(results)}()for result := range results {&nbsp; &nbsp; if result.status {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(result.job, "open")&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go