为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 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 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号