api - goroutines 与数据列表并行运行 post api
问题描述
这是我第一次使用 go,我来自 python 背景,我正在尝试使用具有不同帖子数据集的 goroutine 并行运行这个帖子 api( https://reqres.in/api/users )这是此代码中的变量 jsonStr 。
非常感谢您与数据列表并行运行此 api 的任何帮助
我的数据
data = [{"name": "bonny gaud", "movies": ["Terminator", "Transformer"], {"name": "Sarah Palin", "movies": ["No country for old", "占士邦”] }
我的代码:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"time"
"bytes"
)
func main() {
start := time.Now()
url := "https://reqres.in/api/users"
fmt.Println("URL:>", url)
var jsonStr = []byte(`{"name": "paul rudd", "movies": ["I Love You Man", "Role Models"] }`)
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
req.Header.Set("X-Custom-Header", "myvalue")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("response Status:", resp.Status)
fmt.Println("response Headers:", resp.Header)
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("response Body:", string(body))
fmt.Print("Everything:", time.Since(start))
fmt.Print(string(body))
}
解决方案
您可以使用 waitGroup 或 errGroup。这是示例:
package main
import (
"bytes"
"fmt"
"golang.org/x/sync/errgroup"
"io/ioutil"
"net/http"
"time"
)
func main() {
dataSets := []string{`{"name": "paul rudd", "movies": ["I Love You Man", "Role Models"] }`,
`{"name": "paul rudd", "movies": ["I Love You Man", "Role Models"] }`}
var eg errgroup.Group
client := http.DefaultClient
for _, jsonStr := range dataSets {
eg.Go(func() error {
return callClient(client, jsonStr)
})
}
if err := eg.Wait(); err != nil {
fmt.Printf("Encountered error: %v", err)
}
fmt.Println("Successfully finished.")
}
func callClient(client *http.Client, jsonStr string) error {
start := time.Now()
url := "https://reqres.in/api/users"
fmt.Println("URL:>", url)
req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(jsonStr)))
req.Header.Set("X-Custom-Header", "myvalue")
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
return fmt.Errorf("send request: %w", err)
}
defer resp.Body.Close()
fmt.Println("response Status:", resp.Status)
fmt.Println("response Headers:", resp.Header)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return fmt.Errorf("read body: %w", err)
}
fmt.Println("response Body:", string(body))
fmt.Print("Everything:", time.Since(start))
fmt.Print(string(body))
return nil
}
推荐阅读
- amazon-web-services - Tomcat 管理器响应“失败 - 在上下文路径 [/InsuranceProvider] 部署应用程序,但上下文无法启动
- json - Golang 使用类型结构列表
- json - 如何使用来自 jenkins 工件的 groovy 解析 json 文件,以便将其输入到数据库中。将错误作为退出代码 (1) 或没有内容
- sql - 如何在 SQL 中删除层次结构树
- java - 由于帧缓冲区问题,处理无法运行示例草图
- django - 嗨 Django 社区,我在以超级用户身份从博客文章中删除个别评论时遇到问题?
- oracle - 如何使用 htp.p 在 Oracle 中转义 html?
- typescript - 扩展字符串文字的条件类型
- pymodbus - 如何在每个处理的 pymodbus 服务器事务中运行我自己的方法
- javascript - 如何在 Chart JS 的工具提示中更改页脚的字体粗细