我正在調用每個帶有 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 實際上并不處理任何一個函數的任何處理,而是發送一個調用expenses
and的函數,incomes
然后您按順序調用該函數。這意味著incomes()
直到您調用income, inErr := (<- incomeChan)()
.
本質上,您的“Goroutines”示例在功能上與您的“Sequential”示例相同,但 goroutines 帶來了額外的開銷,因為它們不能保證立即安排。
- 1 回答
- 0 關注
- 169 瀏覽
添加回答
舉報
0/150
提交
取消