我在函数中使用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时是否可以使用上述示例?
任何建议将不胜感激。
答案 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。否则,这只是正常功能。