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

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

在 Golang 中以最小間隔調(diào)用具有可變執(zhí)行時(shí)間的函數(shù)的最佳方法?

在 Golang 中以最小間隔調(diào)用具有可變執(zhí)行時(shí)間的函數(shù)的最佳方法?

Go
至尊寶的傳說(shuō) 2023-06-05 17:16:49
我想在 Go 中以不少于給定時(shí)間間隔執(zhí)行一個(gè)函數(shù),以一次調(diào)用開(kāi)始到下一次調(diào)用開(kāi)始為衡量標(biāo)準(zhǔn)。函數(shù)本身的執(zhí)行時(shí)間會(huì)有所不同。如果該函數(shù)運(yùn)行的時(shí)間超過(guò)該間隔,我想立即再次運(yùn)行它。但是如果/當(dāng)它最終在不到一個(gè)完整的間隔內(nèi)恢復(fù)完成時(shí),我希望它立即恢復(fù)等待直到下一個(gè)間隔邊界。對(duì)于上下文,這是一個(gè)速率限制器——被調(diào)用的函數(shù)可以很容易地讓 CPU 旋轉(zhuǎn),但它不會(huì)產(chǎn)生額外的價(jià)值,因?yàn)樗谂c不可能快速反應(yīng)的人進(jìn)行交互。為清楚起見(jiàn)的示例(interval == 20ms例如):runtime:  15mswait:      5msruntime:  25mswait:      0msruntime:  25mswait:      0msruntime:  15mswait:      5ms <-- this is the important bit如果我使用time.Ticker,我相信額外的“滴答”將在通道中排隊(duì)Ticker.C(如果它被緩沖)導(dǎo)致它在恢復(fù)時(shí)立即進(jìn)行一堆調(diào)用,或者 Ticker 的編寫(xiě)器將阻止寫(xiě)入通道并結(jié)束恢復(fù)后第一次調(diào)用的延遲過(guò)長(zhǎng)。現(xiàn)在我正在做一些數(shù)學(xué)運(yùn)算,這是有效的,但感覺(jué)它可能不符合慣用語(yǔ):minDurationBetweenRuns := time.Millisecond * 100for {    lastRunTime := time.Now()    DO_STUFF_HERE()    durationSinceLastRun := time.Now().Sub(lastRunTime)    if durationSinceLastRun < minDurationBetweenRuns {        sleepTime := minDurationBetweenRuns - durationSinceLastRun        if sleepTime > minDurationBetweenRuns {            sleepTime = minDurationBetweenRuns        }        time.Sleep(sleepTime)    }}
查看完整描述

1 回答

?
斯蒂芬大帝

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

在寫(xiě)問(wèn)題時(shí),我記得 Golang 源代碼非常容易閱讀……并且認(rèn)為我應(yīng)該在看起來(lái)很傻之前先看一眼。我對(duì)我的發(fā)現(xiàn)很滿意 :)

如果報(bào)價(jià)閱讀器落后,它將開(kāi)始丟棄報(bào)價(jià),而不是阻塞寫(xiě)入通道(緩沖區(qū)只有 1)。這樣做的效果是在我們錯(cuò)過(guò)一個(gè)或多個(gè)滴答時(shí)立即讓事情回到“正軌”。

示例證明:

package main


import (

? ? "fmt"

? ? "time"

)


func main() {

? ? t := time.NewTicker(time.Millisecond * 50)

? ? for i := 0; i < 10; i++ {

? ? ? ? fmt.Printf("New invocation starting at %dms\n", time.Now().Round(time.Millisecond).Nanosecond()/int(time.Millisecond))

? ? ? ? if i%3 == 0 {

? ? ? ? ? ? fmt.Println("Executing for 25ms")

? ? ? ? ? ? time.Sleep(time.Millisecond * 25)

? ? ? ? } else {

? ? ? ? ? ? fmt.Println("Executing for 75ms")

? ? ? ? ? ? time.Sleep(time.Millisecond * 75)

? ? ? ? }

? ? ? ? fmt.Println("Waiting for ticker...")

? ? ? ? <-t.C

? ? }

? ? t.Stop()

}

輸出:


New invocation starting at 0ms

Executing for 25ms

Waiting for ticker...

New invocation starting at 50ms

Executing for 75ms

Waiting for ticker...

New invocation starting at 125ms

Executing for 75ms

Waiting for ticker...

New invocation starting at 200ms

Executing for 25ms

Waiting for ticker...

New invocation starting at 250ms

Executing for 75ms

Waiting for ticker...

New invocation starting at 325ms

Executing for 75ms

Waiting for ticker...

New invocation starting at 400ms

Executing for 25ms

Waiting for ticker...

New invocation starting at 450ms

Executing for 75ms

Waiting for ticker...

New invocation starting at 525ms

Executing for 75ms

Waiting for ticker...

New invocation starting at 600ms

Executing for 25ms

Waiting for ticker...


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