英文:
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。接着,我们定义了两个变量resultA和errA,并使用匿名函数启动一个goroutine来执行request1函数,并在执行完成后调用wg.Done()来标记一个goroutine已完成。类似地,我们定义了resultB和errB变量,并使用另一个匿名函数启动一个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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论