我正在调用每个带有 Go 例程的两个函数,我希望同时执行它们所花费的时间应该比我一次运行它们要少得多。但我看到完全相反,并行运行它们需要相同或有时更少的时间。协程 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 elapsed2.79s elapsed3.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 elapsed3.03s elapsed2.70s elapsed是我在这里做错了吗?我期待它花更少的时间在 Goroutine 上。如果有人对我在这里可能做错了什么有任何线索或有任何建议,非常感谢。
1 回答
四季花海
TA贡献1811条经验 获得超5个赞
首先,您将并行性与并发性混淆了。Goroutines 处理并发性,而不是并行性。有关差异的更多背景信息,Go 的创建者之一有一个名为Concurrency is not Parallelism的演讲。
现在来一个实际的答案。
您的 goroutines 实际上并不处理任何一个函数的任何处理,而是发送一个调用expensesand的函数,incomes然后您按顺序调用该函数。这意味着incomes()直到您调用income, inErr := (<- incomeChan)().
本质上,您的“Goroutines”示例在功能上与您的“Sequential”示例相同,但 goroutines 带来了额外的开销,因为它们不能保证立即安排。
- 1 回答
- 0 关注
- 252 浏览
添加回答
举报
0/150
提交
取消
