亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么會有這樣的結果?

為什么會有這樣的結果?

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 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號