为了账号安全,请及时绑定邮箱和手机立即绑定

golang 如何判断一个 goroutine 函数执行完成?

golang 如何判断一个 goroutine 函数执行完成?

Go
慕桂英546537 2019-01-29 06:02:38
用 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)
}


查看完整回答
反对 回复 2019-03-16
?
杨__羊羊

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()

}


查看完整回答
反对 回复 2019-03-16
?
四季花海

TA贡献1811条经验 获得超5个赞

可以在room里加一个字段记录操作是否完成

func foo() {    onlineRooms := getOnlineRooms()
    for _, room := range onlineRooms {
        if room.Done {
            go doSomeThing(room)
        }
    }
}


查看完整回答
反对 回复 2019-03-16
  • 4 回答
  • 0 关注
  • 1486 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信