1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
該軟件包benbjohnson/clock提供模擬時(shí)間設(shè)施。他們的文檔特別指出:
計(jì)時(shí)器和 Tickers 也由同一個(gè)模擬時(shí)鐘控制。它們只會(huì)在時(shí)鐘向前移動(dòng)時(shí)執(zhí)行
所以當(dāng)你調(diào)用時(shí)mockClock.Add,它會(huì)依次執(zhí)行定時(shí)器/代碼。該庫(kù)還添加了連續(xù)的 1 毫秒睡眠,以人為地屈服于其他 goroutines。
當(dāng)計(jì)時(shí)器/自動(dòng)收?qǐng)?bào)機(jī)在 goroutine 外部聲明時(shí),即在調(diào)用之前mockClock.Add,到mockClock.Add被調(diào)用時(shí),模擬時(shí)間確實(shí)有一些東西要執(zhí)行。庫(kù)的內(nèi)部睡眠足以讓子 goroutine 在程序退出之前在自動(dòng)收?qǐng)?bào)機(jī)上接收并打印“完成”。
當(dāng) ticker 在 goroutine 中聲明時(shí),到 timemockClock.Add被調(diào)用時(shí),模擬時(shí)間沒有要執(zhí)行的 ticker,Add基本上什么都不做。內(nèi)部睡眠確實(shí)給了子 goroutine 運(yùn)行的機(jī)會(huì),但是接收到 ticker 現(xiàn)在只會(huì)阻塞;main 然后恢復(fù)并退出。
您還可以查看存儲(chǔ)庫(kù)自述文件中的代碼示例:
mock := clock.NewMock()
count := 0
// Kick off a timer to increment every 1 mock second.
go func() {
ticker := mock.Ticker(1 * time.Second)
for {
<-ticker.C
count++
}
}()
runtime.Gosched()
// Move the clock forward 10 seconds.
mock.Add(10 * time.Second)
// This prints 10.
fmt.Println(count)
這用于在調(diào)用之前runtime.Gosched()
屈服于子 goroutine 。這個(gè)程序的順序基本上是:mock.Add
clock.NewMock()
count := 0
生成子 goroutine
runtime.Gosched()
, 讓步給子 goroutineticker := mock.Ticker(1 * time.Second)
阻塞
<-ticker.C
(模擬時(shí)鐘還沒有向前移動(dòng))恢復(fù)主要
mock.Add
, 它將時(shí)鐘向前移動(dòng)并再次讓步給子 goroutinefor
循環(huán)<-ticker.C
打印 10
出口
按照相同的邏輯,如果您將 a 添加runtime.Gosched()
到第二個(gè)代碼段,它將按預(yù)期工作,就像存儲(chǔ)庫(kù)的示例一樣。游樂場(chǎng):https ://go.dev/play/p/ZitEdtx9GdL
但是,不要依賴runtime.Gosched()
生產(chǎn)代碼,甚至可能不要依賴測(cè)試代碼,除非您非常確定自己在做什么。
最后,請(qǐng)記住time.Sleep(1)
休眠一納秒。
- 1 回答
- 0 關(guān)注
- 146 瀏覽
添加回答
舉報(bào)