1 回答
TA贡献1821条经验 获得超6个赞
processWithChannels如果您需要将超过 1000 个项目放入频道,则调用将挂起。如果您打算使用缓冲通道来保存所有值直到处理,则必须有足够的容量来接受所有值。
如果您要将所有值收集到一个切片中,则没有理由使用通道,您的第二个解决方案就很好。
如果您想尽快“流”回端口,那么您需要介于两种解决方案之间
ports := make(chan string)
var wg sync.WaitGroup
for i := 1; i <= 65535; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
if port := worker(*host, i); port != "" {
ports <- port
}
}(i)
}
go func() {
wg.Wait()
close(ports)
}()
for port := range ports {
fmt.Println("PORT:", port)
}
然而,这很可能会遇到问题,例如当您同时拨打所有 65535 端口时丢失开放端口。这是使用一组工作人员同时拨号的一种可能模式:
ports := make(chan string)
toScan := make(chan int)
var wg sync.WaitGroup
// make 100 workers for dialing
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for p := range toScan {
ports <- worker(*host, p)
}
}()
}
// close our receiving ports channel once all workers are done
go func() {
wg.Wait()
close(ports)
}()
// feed the ports to the worker pool
go func() {
for i := 1; i <= 65535; i++ {
toScan <- i
}
// signal the workers to stop
close(toScan)
}()
for port := range ports {
if port != "" {
fmt.Println("PORT:", port)
}
}
- 1 回答
- 0 关注
- 140 浏览
添加回答
举报