如何正确使用通道进行并发 POST API 调用并将数据记录到 File

问题描述

我正在尝试在 Go 中设计一个 HTTP 客户端,该客户端将能够对 Web 服务进行 cConcurrent API 调用并在文本文件中写入一些数据。

func getTotalCalls() int {
    reader := bufio.NewReader(os.Stdin)
    ...
    return callInt
}

getTotalColls 决定我要打多少个电话,输入来自终端。

func writeToFile(s string,namePrefix string) {
    fileStore := fmt.Sprintf("./data/%s_calls.log",namePrefix)
    ...
    defer f.Close()
    if _,err := f.WriteString(s); err != nil {
        log.Println(err)
    }
}

writeToFile 会将数据从缓冲通道同步写入文件。

func makeRequest(url string,ch chan<- string,id int) {
    var jsonStr = []byte(`{"from": "Saru","message": "Saru to Discovery. Over!"}`)
    req,err := http.NewRequest("POST",url,bytes.NewBuffer(jsonStr))
    req.Header.Set("Content-Type","application/json")
    client := &http.Client{}
    start := time.Now()
    resp,err := client.Do(req)
    if err != nil {
        panic(err)
    }
    secs := time.Since(start).Seconds()
    defer resp.Body.Close()
    body,_ := ioutil.ReadAll(resp.Body)
    ch <- fmt.Sprintf("%d,%.2f,%d,%s,%s\n",id,secs,len(body),body)
}

这是在 go Routine 中调用 API 的函数。

最后是 Main 函数,它将数据从 goroutine 发送到 bufferend 通道,然后我遍历 string 的 bufferend 通道并将数据写入文件。

func main() {
    urlPrefix := os.Getenv("STARCOMM_GO")
    url := urlPrefix + "discovery"
    totalCalls := getTotalCalls()
    queue := make(chan string,totalCalls)

    for i := 1; i <= totalCalls; i++ {
        go makeRequest(url,queue,i)
    }

    for item := range queue {
        fmt.Println(item)
        writeToFile(item,fmt.Sprint(totalCalls))
    }
}

问题是在调用结束时缓冲的不知何故块和程序永远等待所有调用的结束。有人有更好的方法来设计这样的用例吗?我的最终目标是检查不同数量的并发发布请求需要多少时间为每个调用来标记 API 端点为 5、10、50、100、500、1000……一组并发调用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)