我写了一个 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。
由于其中一个正在处理结果,因此在您看来,好像并非所有任务都已处理(这是真的)。
慕的地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")
}
}
- 2 回答
- 0 关注
- 109 浏览
添加回答
举报
0/150
提交
取消