亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在 Golang 中以最小間隔調用具有可變執行時間的函數的最佳方法?

在 Golang 中以最小間隔調用具有可變執行時間的函數的最佳方法?

Go
至尊寶的傳說 2023-06-05 17:16:49
我想在 Go 中以不少于給定時間間隔執行一個函數,以一次調用開始到下一次調用開始為衡量標準。函數本身的執行時間會有所不同。如果該函數運行的時間超過該間隔,我想立即再次運行它。但是如果/當它最終在不到一個完整的間隔內恢復完成時,我希望它立即恢復等待直到下一個間隔邊界。對于上下文,這是一個速率限制器——被調用的函數可以很容易地讓 CPU 旋轉,但它不會產生額外的價值,因為它正在與不可能快速反應的人進行交互。為清楚起見的示例(interval == 20ms例如):runtime:  15mswait:      5msruntime:  25mswait:      0msruntime:  25mswait:      0msruntime:  15mswait:      5ms <-- this is the important bit如果我使用time.Ticker,我相信額外的“滴答”將在通道中排隊Ticker.C(如果它被緩沖)導致它在恢復時立即進行一堆調用,或者 Ticker 的編寫器將阻止寫入通道并結束恢復后第一次調用的延遲過長?,F在我正在做一些數學運算,這是有效的,但感覺它可能不符合慣用語: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貢獻1827條經驗 獲得超8個贊

在寫問題時,我記得 Golang 源代碼非常容易閱讀……并且認為我應該在看起來很傻之前先看一眼。我對我的發現很滿意 :)

如果報價閱讀器落后,它將開始丟棄報價,而不是阻塞寫入通道(緩沖區只有 1)。這樣做的效果是在我們錯過一個或多個滴答時立即讓事情回到“正軌”。

示例證明:

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...


查看完整回答
反對 回復 2023-06-05
  • 1 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號