首页 > 解决方案 > 如何进行并行 http.Get 查询

问题描述

我正在尝试并行进行 http 查询,然后等待所有人完成:

  g1, _ := go http.Get('http://example.com/1')
  g2, _ := go http.Get('http://example.com/2')

  res1 := g1.wait() or { panic(err) }
  res2 := g2.wait() or { panic(err) }

  data1 := json.decode(ApiResult, res1.text) or { panic(err) }
  data2 := json.decode(ApiResult, res2.text) or { panic(err) }

我收到以下错误:

src/main.go:159:11: syntax error: unexpected go, expecting expression

标签: goparallel-processinggo-http

解决方案


生成 goroutine 的语义go不允许自动捕获返回的变量。实现这一点的惯用方法是使用等待组或错误组。

例如,类似这样的代码:

var group errgroup.Group

var resp1 *http.Response
group.Go(func() error {
   var err error
   resp1, err = http.Get('http://example.com/1')
   return err
}

var resp2 *http.Response
group.Go(func() error {
   var err error
   resp2, err = http.Get('http://example.com/2')
   return err
}

err := group.Wait()
if err != nil {
   ...
}

...

注意:resp1&resp2之后可以安全地读取,group.Wait()因为它们是在函数中设置的。


推荐阅读