亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Goroutines 與順序執行花費幾乎相同的時間?

為什么 Goroutines 與順序執行花費幾乎相同的時間?

Go
呼喚遠方 2022-06-21 10:56:22
我正在調用每個帶有 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 帶來了額外的開銷,因為它們不能保證立即安排。


查看完整回答
反對 回復 2022-06-21
  • 1 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號