英文:
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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论