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

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

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

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

Go
桃花長(zhǎng)相依 2023-06-26 16:21:23
我正在使用 Golang,我創(chuàng)建了這個(gè)小應(yīng)用程序來(lái)使用 goroutine 進(jìn)行多個(gè)并發(fā) api 調(diào)用。當(dāng)應(yīng)用程序工作時(shí),調(diào)用完成后,應(yīng)用程序會(huì)卡住,這是有道理的,因?yàn)樗鼰o(wú)法退出范圍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個(gè)贊

當(dāng)沒(méi)有更多的值要發(fā)送時(shí),您將關(guān)閉通道,因此在本例中,是在所有checkUrlgoroutine 完成時(shí)關(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

    }

}

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


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

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

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

注意:處理此類(lèi)情況的更好方法是扇出、扇入并發(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

? ? }

}


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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