我想知道在包的函數(shù)中使用無限 for 循環(huán)是否是一個壞主意,或者是否應該避免這樣做。init()如果可以這樣做或應該避免這種情況,是否有人有任何知識或經(jīng)驗?你會在哪里使用這個?例如,這可以用于提供來自外部源的一些信息的包,這些信息必須定期刷新(例如每天一次)。我使用了如下類似的代碼,但沒有“看門狗”功能。這意味著init()剛剛啟動了一個 go 例程,該例程將在后臺運行,并在蜱到達時運行更新過程。不幸的是,這個更新機制在 aprox 之后停止工作。由于未知原因,3 個月了,但服務運行良好,只是使用“舊”數(shù)據(jù)。簡單示例實現(xiàn)完整示例請參見https://play.golang.org/p/k-GI1t9J4oPpackage infoimport ( "log" "sync" "time")var ( data map[string]interface{} lock sync.RWMutex)func init() { // ticker channel ticker := time.NewTicker(1 * time.Second).C // "watchdog" loop for { log.Println("Starting Update Loop") var wg sync.WaitGroup wg.Add(1) // Start asyc update process. go func() { defer wg.Done() //notify wg when if process ends for whatever reason // Loop forever // Run when a tick is received from the `ticker` channel for { select { case <-ticker: log.Println("Update ticker received") err := update() if err != nil { log.Printf("ERROR: %v\n", err.Error()) } } } }() wg.Wait() }}// internal update function that retrieves some information from some external systemfunc update() error { lock.Lock() defer lock.Unlock() log.Println("Update `data`") // retrieve information and update `data` return nil}// Public function to query datafunc GetInformation(key string) interface{} { lock.RLock() defer lock.RUnlock() return data[key]}該代碼可以正常工作并在單元測試中運行良好,并且也可以正常運行。我想知道長期穩(wěn)定性(一年或更長的正常運行時間)等等。
1 回答

繁星點點滴滴
TA貢獻1803條經(jīng)驗 獲得超3個贊
它位于 goroutine 中,因此技術上沒有問題,但直接在 an 中實現(xiàn)行為init
會使其非常難以使用,原因有兩個:
測試很難,就像
main
測試很難一樣。測試是否調(diào)用另一個函數(shù)要容易得多init
,然后可以對其進行測試。很難推理?!白詣印卑l(fā)生的事情越多,對于使用該包的任何開發(fā)人員(包括未來的你)來說,它的意義就越小。“好吧,我導入了這個包并使用了一個微小的函數(shù),現(xiàn)在不知怎的,我的 CPU 使用率從 1% 上升到了 50%,我做錯了什么”,這樣的事情將會出現(xiàn),需要更多的探索才能弄清楚。
TL;DR 不存在“長期穩(wěn)定性”問題,但很可能存在長期可維護性問題。
- 1 回答
- 0 關注
- 99 瀏覽
添加回答
舉報
0/150
提交
取消