1 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個贊
processWithChannels如果您需要將超過 1000 個項(xiàng)目放入頻道,則調(diào)用將掛起。如果您打算使用緩沖通道來保存所有值直到處理,則必須有足夠的容量來接受所有值。
如果您要將所有值收集到一個切片中,則沒有理由使用通道,您的第二個解決方案就很好。
如果您想盡快“流”回端口,那么您需要介于兩種解決方案之間
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)
}
然而,這很可能會遇到問題,例如當(dāng)您同時撥打所有 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 關(guān)注
- 176 瀏覽
添加回答
舉報(bào)