首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们可以在goroutine中实现goroutine吗?

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

Stack Overflow用户
提问于 2019-02-01 14:51:16
回答 2查看 530关注 0票数 2

我在函数中使用goroutines,因为我想知道函数什么时候启动,那么数据库的查询也会在那个时间运行。但我想问的是,我们能否在另一个goroutine中实现goroutine,因为在函数中,我已经设置了go例程,但在go例程中,有更多的to查询,我希望它们在父goroutine启动时也会运行。示例

代码语言:javascript
复制
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()
}

在实现goroutines时,上面的例子是可能的吗?

如有任何建议,将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2019-02-01 15:03:44

goroutine可以从父母开始goroutine.Once goroutineB从goroutineA开始,他们运行相同的权重。

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

我的新goroutine有必要开始吗?

我给你一个例子,查询请求需要同时保存到数据库和远程日志服务器。两个保存步骤是并行的,不会发生冲突。那么开始2 goroutine是很好的。一个用来保存到数据库中,另一个用来保存到你的查询日志server.Now。GetAnyDataById(Id),很明显,您的新例程查询依赖于您以前的查询结果表单QueryWhichWillReturnId(),它们是不干扰的吗?它们在逻辑上是平行的吗?两者都不是,所以这不是使用goroutine的好地方。

最后,你wg.Add(1),但是你wg.Done()两次,它会死机。

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-05-27 04:14:10

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54474332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档