iT邦幫忙

0

[golang]使用定時器time.NewTicker

最近練習使用ticker ,希望每隔一段時間(ex 30s)就執行doSomeThing()一次,
而發現當程式啟動後,第一次執行也是需要等待30s,
但目標是希望一開始馬上執行一次再隔三十秒執行第二次下去.

而時間有可能會細到500ms就去問一次.

以下是我改過之後的程式部分內容:

fun main(){
    ...
    timeC:=make(chan time.Time,10)
    go doSomeThing(timeC)
	
	ticker := time.NewTicker(rate) //rate是30s
	timeC<-time.Now() //執行第一次
	
	go func() {
		for tick := range ticker.C { //每隔三十秒
			timeC <- tick
		}
	}()
	defer ticker.Stop()
    
    //收到signal才退出
    }
    
    func doSomeThing(timeC chan time.Time){
        for t := range timeC.C {
		...[long time thing, eg:http request & save to db]
        }
    }

1.看起來好像有達到我的預期效果,但擔心這樣改是否會有沒有考慮到的陷阱?

2.會不會有時間精確性方面的問題,如果要評估效能,也會在不同性能電腦上執行,
是否有什麼工具可以協助判斷?

想跟各位高手請教一下,謝謝


11.28 11am更正:使用time.Now()去執行第一次

就直接執行一個 func() , 就是你想做的部分啊.
func() 再被 你的迴圈呼叫啊.
nagiMemo iT邦新手 5 級 ‧ 2020-11-29 11:26:31 檢舉
對耶! 被要放chan time.Time進去而沒想到...我在鬼打牆..,謝謝
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
kanecharles
iT邦見習生 ‧ 2024-04-19 19:47:17

您的代码似乎按预期工作,但您需要考虑一些事项:

使用通道传输时间可能会导致与同步和并发相关的问题。 您需要确保使用该通道不会导致不必要的等待或数据冲突。

至于计时精度的问题,可以使用Go中的time包等性能测量工具来测量程序在不同性能的计算机上的执行时间。 您还可以使用 pprof time calculator 等外部工具来分析 Go 程序的性能。

如果您想确保您的程序在不同性能的计算机上正确有效地运行,您可能需要在各种环境中执行测试和测量性能。

我要發表回答

立即登入回答