为了账号安全,请及时绑定邮箱和手机立即绑定

为什么会有这样的结果?

为什么会有这样的结果?

Go
肥皂起泡泡 2022-06-21 10:30:33
我写了一个 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
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

您无需等待 中的两个“非工作”goroutine main,因此一旦wg.Wait()返回,进程就会关闭,并拆除所有未完成的 goroutine。

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


查看完整回答
反对 回复 2022-06-21
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

工作人员完成后关闭结果通道。在主 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")

    }

}


查看完整回答
反对 回复 2022-06-21
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信