【发布时间】:2020-07-30 23:15:26
【问题描述】:
我正在调用两个函数,每个函数都带有 Go 例程,我希望同时执行它们所需的时间应该比我一次运行它们要少得多。但我看到完全相反,并行运行它们需要相同或有时 更少 的时间。
Goroutines
start := time.Now()
incomeChan := make(chan func() ([]models.Cashflow, *models.ErrorResponse))
expenseChan := make(chan func() ([]models.Cashflow, *models.ErrorResponse))
go func(from, to string, cr *fa.Client, c chan<-func() ([]models.Cashflow, *models.ErrorResponse)) {
log.Println("fetching income")
c <- func() ([]models.Cashflow, *models.ErrorResponse) { return incomes(from, to, cr)}
close(c)
}(from, to, cr, incomeChan)
go func(from, to string, cr *fa.Client, c chan<-func() ([]models.Cashflow, *models.ErrorResponse)){
log.Println("fetching expenses")
c <- func() ([]models.Cashflow, *models.ErrorResponse) {return expenses(from, to, cr)}
close(c)
} (from, to, cr, expenseChan)
income, inErr := (<- incomeChan)()
if inErr != nil {
log.Printf("%#v", inErr)
w.WriteHeader(inErr.Code)
fmt.Fprint(w, helper.JsonStringify(inErr))
return
}
log.Println("income fetch completed")
expense, exErr := (<- expenseChan)()
if exErr != nil {
log.Printf("%#v", exErr)
w.WriteHeader(exErr.Code)
fmt.Fprint(w, helper.JsonStringify(exErr))
return
}
log.Println("expense fetch completed")
fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds())
输出
3.33s elapsed
2.79s elapsed
3.37s elapsed
顺序
income, inErr := incomes(from, to, cr)
if inErr != nil {
log.Printf("%#v", inErr)
w.WriteHeader(inErr.Code)
fmt.Fprint(w, helper.JsonStringify(inErr))
return
}
expense, exErr := expenses(from, to, cr)
if exErr != nil {
log.Printf("%#v", exErr)
w.WriteHeader(exErr.Code)
fmt.Fprint(w, helper.JsonStringify(exErr))
return
}
fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds())
输出
2.98s elapsed
3.03s elapsed
2.70s elapsed
是我在这里做错了吗?我期待它花更少的时间在 Goroutine 上。
如果有人知道我在这里可能做错了什么或有任何建议,不胜感激。
【问题讨论】:
-
奇怪的是,我做了一个更简单的,在操场上睡觉,它按预期工作,只是不是我的。 play.golang.org/p/kwY2mOeSuwO
标签: go concurrency goroutine