用 golang 的一個(gè)定時(shí)任務(wù)的第三方包,每隔 5s 執(zhí)行 foo 函數(shù),如下:func foo() { onlineRooms := getOnlineRooms()
for _, room := range onlineRooms {
go doSomeThing(room)
}
}這里取出所有在線的房間ID,然后啟用 goroutine 執(zhí)行 doSomeThing 函數(shù),這個(gè)函數(shù)里有計(jì)算,從 Redis,MySQL 讀寫數(shù)據(jù)等操作,如果第一輪調(diào)用沒執(zhí)行完,就開始第二輪調(diào)用,就會(huì)有計(jì)算錯(cuò)誤。那么我想每次定時(shí)任務(wù)來的時(shí)候,判斷這個(gè)函數(shù)有沒有執(zhí)行完,如果沒有執(zhí)行完就不重新調(diào)用,否則才調(diào)用,在 golang 中如何實(shí)現(xiàn)這個(gè)判斷呢?
4 回答

千巷貓影
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
提供一個(gè)簡單便于理解方案:
func foo() { onlineRooms := getOnlineRooms() for _, room := range onlineRooms { go doSomeThing(room) } }func doSomeThing(room Room) { //把redis操作換成全局變量亦可 if redis.Get(room){ return } redis.Set(room,true) defer redis.Set(room,false) }

楊__羊羊
TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
package main
import (
"fmt"
"sync"
)
var wg *sync.WaitGroup
func main() {
wg = &sync.WaitGroup{}
for {
wg.Wait()
wg.Add(1)
go test()
}
fmt.Println("vim-go")
}
func test() {
//do something
wg.Done()
}

四季花海
TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
可以在room里加一個(gè)字段記錄操作是否完成
func foo() { onlineRooms := getOnlineRooms() for _, room := range onlineRooms { if room.Done { go doSomeThing(room) } } }
- 4 回答
- 0 關(guān)注
- 1582 瀏覽
添加回答
舉報(bào)
0/150
提交
取消