我们可以在goroutine中实现goroutine吗?

时间:2019-02-01 06:51:16

标签: go goroutine

我在函数中使用goroutines,因为我想函数何时启动,那么数据库查询也将在那个时候运行。但是有一个问题我要问:我们可以在另一个goroutine中实现goroutine吗,因为在函数中我已经设置了go例程,但是在该go例程中有更多查询,我希望它们在父goroutine时也运行开始。例子

func main(){
    wg := &sync.WaitGroup{}
    wg.Add(1)
    go func(){
       defer wg.Done()
       Id,err := QueryWhichWillReturnId()
       if err == nil{
           wg.Add(1)
           go func(){
               defer wg.Done()
               data:= GetAnyDataById(Id)
               fmt.Println(data)
           }()
       }
    }()
  wg.Wait()
}

在实现goroutine时是否可以使用上述示例?

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

goroutine可以从对等的goroutine开始。一旦goroutineB从goroutineA开始,它们运行的​​重量相同。

如果要这样做,您需要考虑一下。

是否需要启动我的新goroutine?

我举一个例子,一个查询请求需要同时保存到数据库和远程日志服务器。两个保存步骤是并行的,没有干扰。那么最好启动2个goroutine。一种保存到数据库,另一种保存到日志服务器。现在查看查询。 GetAnyDataById(Id),显然您的新例行查询取决于您以前的查询结果形式QueryWhichWillReturnId(),它们是否互不干扰?它们在逻辑上平行吗?两者都不是,因此使用goroutine不好。

最后,您wg.Add(1),但是您wg.Done()两次,它将惊慌。

我们可以在goroutine中实现goroutine吗? 是。您可以在任何要启动新goroutine的地方使用go func(){}()

func main(){
    wg := &sync.WaitGroup{}
    wg.Add(1)
    go func(){
       defer wg.Done()
       Id,err := QueryWhichWillReturnId()
       if err != nil{
           fmt.Println(err.Error())
           return
       }
       data:= GetAnyDataById(Id)
       fmt.Println(data)
    }()
  wg.Wait()
}

答案 1 :(得分:0)

实际上,“实施”一词不准确。 go是Go语言的关键字,在Go函数调用以启动goroutine异步之前使用。因此,您几乎可以使用有效的Go函数在任何地方启动goroutine。

仅当在函数之前加上go时才将其视为goroutine。否则,这只是正常功能。