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

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

迭代通道時關(guān)閉通道的最佳時間

迭代通道時關(guān)閉通道的最佳時間

Go
桃花長相依 2023-06-26 16:21:23
我正在使用 Golang,我創(chuàng)建了這個小應(yīng)用程序來使用 goroutine 進(jìn)行多個并發(fā) api 調(diào)用。當(dāng)應(yīng)用程序工作時,調(diào)用完成后,應(yīng)用程序會卡住,這是有道理的,因?yàn)樗鼰o法退出范圍c循環(huán),因?yàn)橥ǖ牢搓P(guān)閉。我不知道在這種模式下哪里可以更好地關(guān)閉通道。package mainimport "fmt"import "net/http"func main() {    links := []string{        "https://github.com/fabpot",        "https://github.com/andrew",        "https://github.com/taylorotwell",        "https://github.com/egoist",        "https://github.com/HugoGiraudel",    }    checkUrls(links)}func checkUrls(urls []string) {    c := make(chan string)    for _, link := range urls {        go checkUrl(link, c)    }    for msg := range c {        fmt.Println(msg)    }    close(c) //this won't get hit}func checkUrl(url string, c chan string) {    _, err := http.Get(url)    if err != nil {        c <- "We could not reach:" + url    } else {        c <- "Success reaching the website:" + url    }} 
查看完整描述

2 回答

?
jeck貓

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個贊

當(dāng)沒有更多的值要發(fā)送時,您將關(guān)閉通道,因此在本例中,是在所有checkUrlgoroutine 完成時關(guān)閉。


var wg sync.WaitGroup


func checkUrls(urls []string) {

    c := make(chan string)


    for _, link := range urls {

        wg.Add(1)

        go checkUrl(link, c)

    }


    go func() {

        wg.Wait()

        close(c)

    }()


    for msg := range c {

        fmt.Println(msg)

    }

}


func checkUrl(url string, c chan string) {

    defer wg.Done()

    _, err := http.Get(url)


    if err != nil {

        c <- "We could not reach:" + url

    } else {

        c <- "Success reaching the website:" + url

    }

}

(請注意,errorfromhttp.Get僅反映連接和協(xié)議錯誤。如果您也期望這些錯誤,那么它不會包含 http 服務(wù)器錯誤,您必須看到如何檢查路徑而不僅僅是主機(jī)。)


查看完整回答
反對 回復(fù) 2023-06-26
?
一只斗牛犬

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

當(dāng)使用通道和 goroutine 在 Go 中編寫程序時,始終要考慮誰(哪個函數(shù))擁有通道。我更喜歡讓擁有通道的函數(shù)關(guān)閉它的做法。如果我要寫這個,我會這樣做,如下所示。

注意:處理此類情況的更好方法是扇出、扇入并發(fā)模式。

package main


import "fmt"

import "net/http"

import "sync"


func main() {

? ? links := []string{

? ? ? ? "https://github.com/fabpot",

? ? ? ? "https://github.com/andrew",

? ? ? ? "https://github.com/taylorotwell",

? ? ? ? "https://github.com/egoist",

? ? ? ? "https://github.com/HugoGiraudel",

? ? }



? ? processURLS(links)

? ? fmt.Println("End of Main")

}


func processURLS(links []string) {

? ? resultsChan := checkUrls(links)


? ? for msg := range resultsChan {

? ? ? ? fmt.Println(msg)

? ? }


}? ? ?


func checkUrls(urls []string) chan string {


? ? outChan := make(chan string)


? ? go func(urls []string) {

? ? ? ?defer close(outChan)


? ? ? ?var wg sync.WaitGroup

? ? ? ?for _, url := range urls {

? ? ? ? ?wg.Add(1)

? ? ? ? ? go checkUrl(&wg, url, outChan)

? ? ? ?}

? ? ? ?wg.Wait()


? ? }(urls)


? ? return outChan

}


func checkUrl(wg *sync.WaitGroup, url string, c chan string) {

? ? defer wg.Done()

? ? _, err := http.Get(url)


? ? if err != nil {

? ? ? ? c <- "We could not reach:" + url

? ? } else {

? ? ? ? c <- "Success reaching the website:" + url

? ? }

}


查看完整回答
反對 回復(fù) 2023-06-26
  • 2 回答
  • 0 關(guān)注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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