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

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

使用 channnels 的 goroutines 同步問題

使用 channnels 的 goroutines 同步問題

Go
富國滬深 2022-08-24 16:08:58
我正在使用以下代碼來同步goroutines。最近在調(diào)查一個錯誤時,我發(fā)現(xiàn)下面的代碼并不總是有效。大約五分之一的失敗。頻道在我的頻道之前獲取消息。我能夠在本地(而不是在go-playground)和k8s環(huán)境中始終如一地重現(xiàn)此問題。作為一種解決方法,我現(xiàn)在使用同步。quitoutsync.Map有沒有辦法修復下面的代碼?package mainimport (    "fmt"    "io/ioutil"    "log"    "os"    "path"    "sync"    "sync/atomic"    "time")func main() {    //test setup    filePaths := []string{        path.Join(os.TempDir(), fmt.Sprint("f1-", time.Now().Nanosecond())),        path.Join(os.TempDir(), fmt.Sprint("f2-", time.Now().Nanosecond())),        path.Join(os.TempDir(), fmt.Sprint("f3-", time.Now().Nanosecond())),        path.Join(os.TempDir(), fmt.Sprint("f4-", time.Now().Nanosecond())),        path.Join(os.TempDir(), fmt.Sprint("f5-", time.Now().Nanosecond())),        path.Join(os.TempDir(), fmt.Sprint("f6-", time.Now().Nanosecond())),    }    for _, filePath := range filePaths {        f, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)        if err != nil {            log.Fatal(err)        }        _, err = f.WriteString("There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.")        if err != nil {            log.Fatal(err)        }        err = f.Close()        if err != nil {            log.Fatal(err)        }    }
查看完整描述

1 回答

?
紫衣仙女

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

收到退出時,輸出通道可以包含值。通過制作無緩沖通道進行修復:

out := make(chan []byte)

這可確保在退出之前收到從工作線程發(fā)送的值:

  • 在無緩沖信道上發(fā)送/接收發(fā)生在調(diào)用wg.Done()

  • 所有電話在返回之前發(fā)生wg.Done()wg.Wait()

  • wg.Wait()在將值發(fā)送到 之前返回quit

因此,在將值發(fā)送到 之前,將從 接收值。outquit

另一種方法是關(guān)閉通道,向結(jié)果收集器發(fā)出工作線程已完成的信號:out

func getContents(fileNames []string) ([][]byte, error) {

    wg := sync.WaitGroup{}

    var responseBytes [][]byte

    out := make(chan []byte)

    var opsFileRead uint64

    var opsChannelGot uint64


    for _, fileName := range fileNames {

        wg.Add(1)

        go func(fName string, out chan []byte, wg *sync.WaitGroup) {

            defer wg.Done()

            data, err := ioutil.ReadFile(fName)

            if err != nil {

                log.Fatal(err)

            }

            out <- data

            atomic.AddUint64(&opsFileRead, 1)

        }(fileName, out, &wg)

    }


    // Close out after workers are done.

    go func() {

        wg.Wait()

        close(out)

    }()


    // Loop over outputs until done.

    for bts := range out {

        if len(bts) > 0 {

            atomic.AddUint64(&opsChannelGot, 1)

            responseBytes = append(responseBytes, bts)

        }

    }


    fmt.Printf("I quit, i read %d, i got %d\n", opsFileRead, opsChannelGot)


    return responseBytes, nil

}


查看完整回答
反對 回復 2022-08-24
  • 1 回答
  • 0 關(guān)注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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