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

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

為什么在 goroutine 中聲明時(shí) benbjohnson/clock 模擬計(jì)時(shí)器不執(zhí)行?

為什么在 goroutine 中聲明時(shí) benbjohnson/clock 模擬計(jì)時(shí)器不執(zhí)行?

Go
RISEBY 2022-11-28 17:03:52
此代碼按我預(yù)期的方式工作import (    "fmt"    "time"    "github.com/benbjohnson/clock")func main() {    mockClock := clock.NewMock()    timer := mockClock.Timer(time.Duration(2) * time.Second)    go func() {        <-timer.C        fmt.Println("Done")    }()    mockClock.Add(time.Duration(10) * time.Second)    time.Sleep(1)}它按我的預(yù)期打印“完成”。而這個(gè)功能不import (    "fmt"    "time"    "github.com/benbjohnson/clock")func main() {    mockClock := clock.NewMock()    go func() {        timer := mockClock.Timer(time.Duration(2) * time.Second)        <-timer.C        fmt.Println("Done")    }()    mockClock.Add(time.Duration(10) * time.Second)    time.Sleep(1)}這里唯一的區(qū)別是我在 goroutine 外部和內(nèi)部聲明定時(shí)器。該mockClock Timer()方法有一個(gè)指針接收器并返回一個(gè)指針。我無法解釋為什么第一個(gè)有效而第二個(gè)無效。
查看完整描述

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(), 讓步給子 goroutine

  • ticker := mock.Ticker(1 * time.Second)

  • 阻塞<-ticker.C(模擬時(shí)鐘還沒有向前移動(dòng))

  • 恢復(fù)主要

  • mock.Add, 它將時(shí)鐘向前移動(dòng)并再次讓步給子 goroutine

  • for循環(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)休眠一納秒。


查看完整回答
反對(duì) 回復(fù) 2022-11-28
  • 1 回答
  • 0 關(guān)注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)