用 golang 的一个定时任务的第三方包,每隔 5s 执行 foo 函数,如下:func foo() { onlineRooms := getOnlineRooms()
for _, room := range onlineRooms {
go doSomeThing(room)
}
}这里取出所有在线的房间ID,然后启用 goroutine 执行 doSomeThing 函数,这个函数里有计算,从 Redis,MySQL 读写数据等操作,如果第一轮调用没执行完,就开始第二轮调用,就会有计算错误。那么我想每次定时任务来的时候,判断这个函数有没有执行完,如果没有执行完就不重新调用,否则才调用,在 golang 中如何实现这个判断呢?
4 回答
千巷猫影
TA贡献1829条经验 获得超7个赞
提供一个简单便于理解方案:
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贡献1943条经验 获得超7个赞
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贡献1811条经验 获得超5个赞
可以在room里加一个字段记录操作是否完成
func foo() { onlineRooms := getOnlineRooms() for _, room := range onlineRooms { if room.Done { go doSomeThing(room) } } }
- 4 回答
- 0 关注
- 1539 浏览
添加回答
举报
0/150
提交
取消