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

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

How to make 2 concurrent network requests in Golang

问题

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

例如:

func request1() (resultTypeA, error) {
  ....
}

func request2() (requestTypeB, error) {
  ...
}

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

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

I have two functions that make networks requests:

e.g.:

func request1() (resultTypeA, error) {
  ....
}

func request2() (requestTypeB, error) {
  ...
}

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

resultA, err := request1()
resultB, err := request2()

答案1

得分: 2

使用sync.WaitGroup

var wg sync.WaitGroup
wg.Add(2)
var resultA resultTypeA
var errA error
go func() {
    resultA, errA = request1()
    wg.Done()
}()
var resultB resultTypeB
var errB error
go func() {
    resultB, errB = request2()
    wg.Done()
}()
wg.Wait()

if errA != nil {
    return errA
}
if errB != nil {
    return errB
}

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

var wg sync.WorkGroup
wg.Add(2)
var resultA resultTypeA, errA error
go func() {
    resultA, errA = request1()
    wg.Done()
}()
var resultB resultTypeB, errB error
go func() {
    resultB, errB = request2()
    wg.Done()
}()
wg.Wait()

if errA != nil {
    return errA
}
if errB != nil {
    return errB
}

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:

确定