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

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

迭代通道時關閉通道的最佳時間

迭代通道時關閉通道的最佳時間

Go
桃花長相依 2023-06-26 16:21:23
我正在使用 Golang,我創建了這個小應用程序來使用 goroutine 進行多個并發 api 調用。當應用程序工作時,調用完成后,應用程序會卡住,這是有道理的,因為它無法退出范圍c循環,因為通道未關閉。我不知道在這種模式下哪里可以更好地關閉通道。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貢獻1909條經驗 獲得超7個贊

當沒有更多的值要發送時,您將關閉通道,因此在本例中,是在所有checkUrlgoroutine 完成時關閉。


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僅反映連接和協議錯誤。如果您也期望這些錯誤,那么它不會包含 http 服務器錯誤,您必須看到如何檢查路徑而不僅僅是主機。)


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

TA貢獻1784條經驗 獲得超2個贊

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

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

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

? ? }

}


查看完整回答
反對 回復 2023-06-26
  • 2 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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