首页 > 其他分享 >golang 代码实现:并发请求下游接口,下游接口限制请求参数中某数组单次最多传20个

golang 代码实现:并发请求下游接口,下游接口限制请求参数中某数组单次最多传20个

时间:2023-09-30 21:34:21浏览次数:40  
标签:20 请求 largeArray 接口 数组 end 下游 string

内容来自对 chatgpt 的咨询

假设你有一个golang 的数组,数组元素数量大于20,你需要调用下游接口,但是接口的请求参数限制了一次最多传20个,为了节省时间,你需要并发调用,完整整个数组的下游调用,请完成代码编写

写法一

我们将数组切分成最大20个元素的小块,并对每个块并发调用下游接口:

package main

import (
	"fmt"
	"sync"
)

// 假设你的数组
var largeArray = []string{/* your data here */}

// 假设的下游接口调用函数,接受一个string数组作为参数
func callAPI(arr []string) {
	// 你的API调用逻辑
}

func main() {
	// 组定义
	var wg sync.WaitGroup
	chunkSize := 20

	// 将大数组分解成大小最大为20的小数组
	for i := 0; i < len(largeArray); i += chunkSize {
		wg.Add(1) // 为每个小组添加一个等待组

		end := i + chunkSize
		if end > len(largeArray) {
			end = len(largeArray)
		}

		// 启动一个并发goroutine来处理每个小数组 
		// 这会立即执行,i 和 end 的当前值将传递给goroutine
		go func(start, end int) {
			defer wg.Done() // 在goroutine结束时告知等待组
			callAPI(largeArray[start:end])
		}(i, end) 
	}

	// 等待所有API调用完成
	wg.Wait()
	fmt.Println("All API calls completed.")
}

另一种写法

也可以利用 sliecs.ChunkEverytInt 函数把原数组按照 20 的大小切割成二维数组,每个字数组长度为 20,之后遍历这个二维数组即可。

package main

import (
	"fmt"
	"sync"
)

// 假设你的数组
var largeArray = []string{/* your data here */}

// 假设的下游接口调用函数,接受一个string数组作为参数
func callAPI(arr []string) {
	// 你的API调用逻辑
}

func main() {
	// 组定义
	var wg sync.WaitGroup
	chunkSize := 20
    if len(largeArray) <= 0 { // ChunkEveryInt返回切片的切片,每个切片包含count个元素,其中每个新的chunk开始将step元素放入可枚举对象中。计数小于等于0时会触发 panic。
      return
    }
    tempChunkArrs := slices.ChunkEveryInt(largeArray, 20)

	// 将大数组分解成大小最大为20的小数组
	for _, subArr := range tempChunkArrs {
		wg.Add(1) // 为每个小组添加一个等待组
		// 启动一个并发goroutine来处理每个小数组 
		go func() {
			defer wg.Done() // 在goroutine结束时告知等待组
			callAPI(subArr)
		}() 
	}

	// 等待所有API调用完成
	wg.Wait()
	fmt.Println("All API calls completed.")
}

特别提醒

使用 slices.ChunkEveryInt 返回切片的切片,每个切片包含count个元素,使用函数前需要判断原数组长度是否大于0,计数小于等于0时会触发 panic。

标签:20,请求,largeArray,接口,数组,end,下游,string
From: https://www.cnblogs.com/hi3254014978/p/17738260.html

相关文章

  • ajax post请求爬肯德基餐厅
    importurllib.requestimporturllib.parseimportjsondefgetKenData(index):headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.110Safari/537.36Edg/96.......
  • 接口测试
    接口测试分层自动化测试UI自动化测试:主要通过模拟用户在界面的操作完成测试Unit层自动化测试:主要验证程序代码的正确性和语法的正确性Service层测试:主要测试模块之间的调用关系的正确性接口接口全称为应用编程接口,简称为API接口的本质是程序员开发的函数或方法,是完成一定功能的代......
  • http get 请求,path请求参数有数组类型的参数,怎么传参
    内容来自对chatgpt的咨询当在HTTPGET请求中传递数数组类型的参数时,需要按照一定的格式进行编码。并且具体的格式可能会根据后端的实现和预期的格式进行变化。这里有两种常见的方法:方法一:相同参数名,多次出现在URL中,后面每一个数组元素都用相同的参数名。例如,如果你有一个名......
  • 通过python封装接口商品ID采集商品详情数据
    您可以使用Python中的requests库和json库发起HTTP请求并解析响应数据,来实现获取微店商品详情数据的操作。以下是一个简单的示例代码:importrequestsimportjsondeffetch_weidian_product_detail(product_id):#构造请求URLurl=f"https://api.vdian.com/api?param={json.dumps......
  • 重定向和请求转发
    引言重定向(Redirect)和请求转发(Forward)都是在Web开发中用来处理页面跳转的方式。重定向重定向(Redirect)是通过发送特定的HTTP响应来告诉浏览器将请求重定向到另一个URL。当服务器收到一个请求后,如果需要将用户从当前页面导航到另一个页面,可以发送一个重定向响应给浏览器,浏览器会......
  • post请求
    importurllib.requestimporturllib.parseheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.110Safari/537.36Edg/96.0.1054.62'}data={'kw......
  • python爬虫请求头键值对批量加引号
    原始数据:from:ento:zhquery:lovetranstype:realtimesimple_means_flag:3sign:198772.518981token:1b434ed1e595135ac1b2959f4430a51fdomain:commonts:1696058611509使用notepad++粘贴数据然后Ctrl+H,勾选正则表达式,第一行为(.*):(.*)第二行为'$1':......
  • 抽象类和接口
    1.引言接口和抽象类是面向对象编程中的两个概念,用于实现代码的抽象和封装。2.抽象类2.1定义抽象类(AbstractClass)是用于实现部分行为的类,它不能被实例化。抽象类可以包含普通方法、抽象方法(只有方法签名,没有具体实现)和属性,但抽象类中的抽象方法必须在子类中被实现。抽象类......
  • Get请求和Post请求
    引言Get请求和Post请求都是HTTP协议中的两种常见请求方法,底层都是TCP/IP协议,用于客户端与服务器之间的数据传输。Get请求Get请求用于从服务器获取数据,通过在URL中添加参数,将数据附加在请求中发送给服务器Get请求的参数是通过URL的查询字符串(querystring)来传递的,参数会被明......
  • API商品数据接口调用
    一、API商品数据接口概述API商品数据接口是一种通用的数据交互方式,它允许不同系统之间进行数据传输和交互。API商品数据接口可以使用各种不同的协议和标准来实现,例如RESTfulAPI、SOAP、XML-RPC等。其中RESTfulAPI是最常用的一种,它基于HTTP协议和JSON格式进行数据传输,具有简单易用......