第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在并發(fā)操作中關(guān)閉通道?

如何在并發(fā)操作中關(guān)閉通道?

Go
qq_花開(kāi)花謝_0 2022-10-04 16:37:32
我寫了一個(gè)關(guān)于并發(fā)和通道??的go代碼package mainimport (    "fmt"    "net/http")var links = []string{    "https://mcevik.com",    "https://stackoverflow.com",    "https://www.linkedin.com",    "https://github.com",    "https://medium.com",    "https://kaggle.com",}func getLink(link string, ch chan string) {    if res, err := http.Get(link); err != nil {        ch <- err.Error()    } else {        ch <- fmt.Sprintf("[%d] - %s", res.StatusCode, link)    }}func main() {    ch := make(chan string, len(links))    for _, link := range links {        go getLink(link, ch)    }    for msg := range ch {        fmt.Println(msg)    }}https://play.golang.org/p/Uz_k8KI6bKt輸出是這樣的 ??在輸出中,我們看到程序未終止。節(jié)目未終止的原因是通道尚未關(guān)閉,因此無(wú)法退出循環(huán)。如何關(guān)閉通道并修復(fù)代碼?
查看完整描述

3 回答

?
Cats萌萌

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊

使用等待組監(jiān)視寫入完成。


    ch := make(chan string, len(links))

    var wg sync.WaitGroup

    for _, link := range links {

        wg.Add(1)

        go func(){

            getLink(link, ch)

            wg.Done()

        }()

    }

使用另一個(gè)例程偵聽(tīng)該事件并關(guān)閉通道。


    go func(){

        wg.Wait()

        close(ch)

    }()

    for msg := range ch {

        fmt.Println(msg)

    }


查看完整回答
反對(duì) 回復(fù) 2022-10-04
?
青春有我

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果您只啟動(dòng)N個(gè)(即)Go例程,所有這些例程都必然會(huì)發(fā)回一條消息,那么最簡(jiǎn)單的方法是在關(guān)閉通道之前從通道中讀取恰好N條消息。len(links)


不要越過(guò)頻道;當(dāng)您不知道將收到多少項(xiàng)目并且想要閱讀直到頻道關(guān)閉時(shí),這是最有用的。而是循環(huán)給定的次數(shù):range


// main:


for _ = range links {

    fmt.Println(<-ch)

}


close(ch)


查看完整回答
反對(duì) 回復(fù) 2022-10-04
?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊

通過(guò)將 WaitGroup 添加到方法中來(lái)重構(gòu)它,getLink


func getLink(link string, wg *sync.WaitGroup, ch chan string)

和頻道在呼叫后關(guān)閉。wg.Wait()


go func() {

    wg.Wait()

    close(ch)

}()

因此,代碼的最終版本如下所示 ??


package main


import (

    "fmt"

    "net/http"

    "sync"

)


var links = []string{

    "https://mcevik.com",

    "https://stackoverflow.com",

    "https://www.linkedin.com",

    "https://github.com",

    "https://medium.com",

    "https://kaggle.com",

}


func getLink(link string, wg *sync.WaitGroup, ch chan string) {

    defer wg.Done()


    if res, err := http.Get(link); err != nil {

        ch <- err.Error()

    } else {

        ch <- fmt.Sprintf("[%d] - %s", res.StatusCode, link)

    }

}


func main() {

    wg := sync.WaitGroup{}

    ch := make(chan string, len(links))


    for _, link := range links {

        wg.Add(1)

        go getLink(link, &wg, ch)

    }


    go func() {

        wg.Wait()

        close(ch)

    }()


    for msg := range ch {

        fmt.Println(msg)

    }

}

https://play.golang.org/p/741F8eHrhFP


查看完整回答
反對(duì) 回復(fù) 2022-10-04
  • 3 回答
  • 0 關(guān)注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)