我在函数中使用goroutines,因为我想知道函数什么时候启动,那么数据库的查询也会在那个时间运行。但我想问的是,我们能否在另一个goroutine中实现goroutine,因为在函数中,我已经设置了go例程,但在go例程中,有更多的to查询,我希望它们在父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()
}在实现goroutines时,上面的例子是可能的吗?
如有任何建议,将不胜感激。
发布于 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(){}()。
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()
}发布于 2020-05-27 04:14:10
实际上,“实现”这个词并不准确。go是Go语言中的一个关键字,用于在Go函数调用之前启动goroutine异步。因此,您可以使用有效的Go函数在几乎任何地方启动goroutine。
只有当一个函数在调用前带有go时,它才会被视为goroutine。否则,它只是一个正常的函数。
https://stackoverflow.com/questions/54474332
复制相似问题