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

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

具有緩沖作業(yè)和固定輪詢(xún)間隔的工作池

具有緩沖作業(yè)和固定輪詢(xún)間隔的工作池

Go
呼喚遠(yuǎn)方 2022-05-23 15:59:03
我有一個(gè)工作人員池在工作頻道上監(jiān)聽(tīng),并在結(jié)果頻道上做出響應(yīng)。作業(yè)生產(chǎn)者必須以固定的代碼間隔運(yùn)行。在讀取足夠的新作業(yè)以填滿(mǎn)緩沖區(qū)之前,必須刷新結(jié)果。批量刷新結(jié)果和讀取新作業(yè)至關(guān)重要。請(qǐng)參閱下面的示例代碼,在這里的操場(chǎng)上運(yùn)行它。是否可以在沒(méi)有原子計(jì)數(shù)器的情況下重寫(xiě)它來(lái)跟蹤飛行作業(yè)?
查看完整描述

1 回答

?
開(kāi)滿(mǎn)天機(jī)

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

這是您的代碼的基于通道的版本,在功能上等同于上面示例的意圖。關(guān)鍵點(diǎn)是我們沒(méi)有使用任何原子值來(lái)改變代碼的邏輯,因?yàn)檫@不提供 goroutine 之間的同步。goroutine 之間的所有交互都使用通道sync.WaitGroup、 或同步context.Context。可能有更好的方法來(lái)解決手頭的問(wèn)題,但這表明沒(méi)有必要的原子來(lái)協(xié)調(diào)隊(duì)列和工作人員。


這里唯一在 goroutines 之間仍然不協(xié)調(diào)的值是len(jobs)在日志輸出中的使用。使用它是否有意義取決于你,因?yàn)樗闹翟诓l(fā)世界中是沒(méi)有意義的,但它是安全的,因?yàn)樗菫椴l(fā)使用而同步的,并且沒(méi)有基于該值的邏輯。


buf := 5

workers := 3

jobs := make(chan int, buf)


// results buffer must always be larger than workers + buf to prevent deadlock

results := make(chan int, buf*2)


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

defer cancel()


// Start workers

var wg sync.WaitGroup

for n := 0; n < workers; n++ {

    wg.Add(1)

    go func(n int) {

        defer wg.Done()

        for jobID := range jobs {

            fmt.Printf("worker %v processing %v - %v jobs left\n", n, jobID, len(jobs))

            time.Sleep(time.Duration(rand.Intn(5)) * pollInterval)

            results <- jobID

        }

        fmt.Printf("worker %v exited", n)

    }(n)

}


var done sync.WaitGroup

done.Add(1)

go func() {

    defer done.Done()

    ticker := time.NewTicker(pollInterval)

    r := make([]string, 0)


    flushResults := func() {

        fmt.Printf("===> results: %v\n", strings.Join(r, ","))

        r = r[:0]

    }


    for {

        select {

        case <-ticker.C:

            flushResults()


            // send max buf jobs, or fill the queue

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

                jobID++

                select {

                case jobs <- jobID:

                    continue

                }

                break

            }

            fmt.Printf("===> send %v jobs\n", i)


        case jobID := <-results:

            r = append(r, fmt.Sprintf("%v", jobID))


        case <-ctx.Done():

            // Close jobs channel to stop workers

            close(jobs)

            // Wait for workers to exit

            wg.Wait()


            // we can close results for easy iteration because we know

            // there are no more workers.

            close(results)

            // Flush remaining results

            for jobID := range results {

                r = append(r, fmt.Sprintf("%v", jobID))

            }

            flushResults()

            return

        }

    }

}()


查看完整回答
反對(duì) 回復(fù) 2022-05-23
  • 1 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專(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)