【问题标题】:Can we implement goroutine in the goroutine?我们可以在goroutine中实现goroutine吗?
【发布时间】:2019-06-25 17:25:01
【问题描述】:

我在函数中使用 goroutine,因为我希望函数何时启动,然后数据库的查询也在那个时间运行。但是我问了一个问题,我们可以在另一个 goroutine 中实现一个 goroutine,因为在函数中我已经设置了一个 goroutine,但是在那个 goroutine 中有更多查询,我希望它们在父 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 时是否可行?

任何建议将不胜感激。

【问题讨论】:

  • 除了奇怪的格式,代码对我来说看起来不错。你只需要在某个地方打电话给wg.Wait()
  • @RolandIllig 是的,但这是一个我表示感谢的例子
  • 是的,您可以,您是在尝试时遇到了问题,还是没有实际尝试?

标签: go goroutine


【解决方案1】:

goroutine 可以从一个父 goroutine 开始。一旦 goroutineB 从 goroutineA 开始,它们运行相同的权重。

如果你想这样做,你需要考虑一件事。

我的新 goroutine 需要启动吗?

我举一个例子,查询请求需要同时保存到数据库和远程日志服务器。两个省电步骤并行,互不干扰。然后启动2个goroutine就好了。一个保存到数据库,一个保存到日志服务器。现在你看看你的查询。 GetAnyDataById(Id),显然您的新常规查询取决于您以前的查询结果表单QueryWhichWillReturnId(),它们不会干扰吗?它们在逻辑上是平行的吗?两者都不是,所以这是使用 goroutine 的坏地方。

最后,你wg.Add(1),但你wg.Done()两次,它会恐慌。

我们可以在 goroutine 中实现 goroutine 吗? 是的。你可以使用go func(){}() 来启动一个新的goroutine。

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

【讨论】:

  • 你的意思是defer wg.Done()我已经打了两次电话,它会让我感到恐慌?
  • @puneet55667788 你还没有完成wg.Wait()。恐慌可能会消失,因为 main 停止了,你的 goroutine 也因此被强制死亡
【解决方案2】:

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

只有当一个函数在调用之前加上go 时,它才会被视为一个goroutine。否则,它只是一个正常的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 2019-08-09
    • 2014-10-20
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    相关资源
    最近更新 更多