如何在Golang中进行两个并发网络请求

huangapple go评论179阅读模式
英文:

How to make 2 concurrent network requests in Golang

问题

我有两个进行网络请求的函数:

例如:

  1. func request1() (resultTypeA, error) {
  2. ....
  3. }
  4. func request2() (requestTypeB, error) {
  5. ...
  6. }

由于它们是两种不同的类型,我不能只使用一个通道。最佳的并行调用模式是什么:

  1. resultA, err := request1()
  2. resultB, err := request2()
英文:

I have two functions that make networks requests:

e.g.:

  1. func request1() (resultTypeA, error) {
  2. ....
  3. }
  4. func request2() (requestTypeB, error) {
  5. ...
  6. }

Given that they are two different types, I can't just use one channel.
What is the best pattern to parallelize to calls:

  1. resultA, err := request1()
  2. resultB, err := request2()

答案1

得分: 2

使用sync.WaitGroup

  1. var wg sync.WaitGroup
  2. wg.Add(2)
  3. var resultA resultTypeA
  4. var errA error
  5. go func() {
  6. resultA, errA = request1()
  7. wg.Done()
  8. }()
  9. var resultB resultTypeB
  10. var errB error
  11. go func() {
  12. resultB, errB = request2()
  13. wg.Done()
  14. }()
  15. wg.Wait()
  16. if errA != nil {
  17. return errA
  18. }
  19. if errB != nil {
  20. return errB
  21. }

sync.WaitGroup用于等待一组goroutine完成执行。在上述代码中,我们创建了一个sync.WaitGroup实例wg,然后调用Add方法来设置等待的goroutine数量为2。接着,我们定义了两个变量resultAerrA,并使用匿名函数启动一个goroutine来执行request1函数,并在执行完成后调用wg.Done()来标记一个goroutine已完成。类似地,我们定义了resultBerrB变量,并使用另一个匿名函数启动一个goroutine来执行request2函数。最后,我们调用wg.Wait()来等待所有的goroutine执行完成。

如果errA不为nil,则返回errA;如果errB不为nil,则返回errB

英文:

Use a sync.WorkGroup

  1. var wg sync.WorkGroup
  2. wg.Add(2)
  3. var resultA resultTypeA, errA error
  4. go func() {
  5. resultA, errA = request1()
  6. wg.Done()
  7. }()
  8. var resultB resultTypeB, errB error
  9. go func() {
  10. resultB, errB = request2()
  11. wg.Done()
  12. }()
  13. wg.Wait()
  14. if errA != nil {
  15. return errA
  16. }
  17. if errB != nil {
  18. return errB
  19. }

huangapple
  • 本文由 发表于 2016年4月22日 12:02:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/36784593.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定