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

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

go routines 和接收錯誤或成功的通道

go routines 和接收錯誤或成功的通道

Go
海綿寶寶撒 2022-11-28 17:13:24
我有一個函數(shù),我想定義最大數(shù)量的 go 例程,我有一個列表,我遍歷這個列表,然后通過通道向 go 例程發(fā)送消息,在這個 go 例程中,我將調(diào)用一個函數(shù)將得到答案或錯誤,當(dāng)它不是錯誤時我想將返回保存在一個切片中,當(dāng)它是錯誤時我想停止 go 例程并進行調(diào)用。但我無法做到,當(dāng)我有錯誤時,所有的 go 例程都結(jié)束,我需要 err 的值type response struct {    value string}func Testing() []response {    fakeValues := getFakeValues()    maxParallel := 25    wg := &sync.WaitGroup{}    wg.Add(maxParallel)    if len(fakeValues) < maxParallel {        maxParallel = len(fakeValues)    }    errReceive := make(chan error, 1)    defer close(errReceive)    response := make([]response, 0)    valuesChan := make(chan string, 1)    for i := 0; i < maxParallel; i++ {        go func(valuesChan <-chan string, errReceive chan error) {            for value := range valuesChan {                resp, err := getFakeResult(value)                if err != nil {                    errReceive <- err                }                response = append(response, resp)            }            wg.Done()        }(valuesChan, errReceive)    }    for _, val := range fakeValues {        valuesChan <- val    }    close(valuesChan)    wg.Wait()    err := <-errReceive    if err != nil {        // make any thing    }    return response}func getFakeValues() []string {    return []string{"a", "b"}}func getFakeResult(val string) (response, error) {    if val == "a" {        return response{}, fmt.Errorf("ooh noh:%s", val)    }    return response{        value: val,    }, nil}
查看完整描述

1 回答

?
慕容3067478

TA貢獻1773條經(jīng)驗 獲得超3個贊

您可以使用帶取消的上下文,并使用它讓 go 例程知道它們應(yīng)該停止。


ctx, cancel := context.WithCancel(context.Background())

defer cancel()


wg := &sync.WaitGroup{}

wg.Add(1)

go func(ctx context.Context) {

    defer wg.Done()

    for {

        select {

        case <-ctx.Done():

            fmt.Println("context is done")

            return

        case <-time.After(time.Second):

            fmt.Println("work")

        }

    }

}(ctx)


time.Sleep(time.Second * 5)

cancel()

wg.Wait()

https://go.dev/play/p/qe2oDppSnaF


這是一個示例,可以在您的用例上下文中更好地展示它。


type result struct {

    err error

    val int

}

rand.Seed(time.Now().UnixNano())


ctx, cancel := context.WithCancel(context.Background())

defer cancel()


rchan := make(chan result, 5)

wg := &sync.WaitGroup{}


for i := 0; i < 5; i++ {

    wg.Add(1)

    go func(ctx context.Context) {

        defer wg.Done()

        for {

            select {

            case <-ctx.Done():

                fmt.Println("context is done")

                return

            case <-time.After(time.Second):

                n := rand.Intn(100)

                if n > 90 {

                    rchan <- result{err: fmt.Errorf("error %d", n)}

                } else {

                    rchan <- result{val: n}

                }

            }

        }

    }(ctx)

}


go func() {

    wg.Wait()

    close(rchan)

}()


for res := range rchan {

    if res.err != nil {

        fmt.Println(res.err)

        cancel()

        break

    } else {

        fmt.Println(res.val)

    }

}

https://go.dev/play/p/Z63n1h2A81o


查看完整回答
反對 回復(fù) 2022-11-28
  • 1 回答
  • 0 關(guān)注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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