需求
一个接口调用时,接收到一个列表,十个元素,需要并发执行十个任务,每个任务都要返回执行的结果和异常,然后对返回的结果装填到一个切片列表里,统一返回结果。
需要协程处理的结构体
type order struct { name string `json:name` id int `json:id` } 确定通道数量
一般按入参的需要处理的元素数量为准
tasknum := 10
初始化通道
orderch := make(chan order, tasknum) //接收返回的结果errch := make(chan error, tasknum) //接收返回的异常 发起执行,我们使用sync.waitgroup来监听执行情况
wg := sync.waitgroup{}for i:=0; i < tasknum; i++ { wg.add(1) go func() { defer wg.done() if i == 3 {//模拟当i=3的时候,返回一个异常 err := errors.new(there is an error) errch <- err return } //组装返回结果 res := order{ name: num: + strconv.itoa(i), id: i, } orderch <- res }()}wg.wait() //等待所有任务执行完毕 使用for-select接收执行结果
orderlist := make([]order, tasknum)for i:=0; i
任务执行过程中,需要控制每个任务的执行时间,不能超过一定范围,我们用定时器来解决这个问题
timeouttime := time.second * 3 //超时时间tasktimer := time.newtimer(timeouttime) //初始化定时器orderlist := make([]order, tasknum)for i:=0; i 主程序是无法捕捉协程内的panic,因此如果不手动处理,就会发生协程内panic导致整个程序中止的情况,我们在defer里处理
for i:=0; i < tasknum; i++ { wg.add(1) go func() { defer func () { wg.done() //协程内单独捕捉异常 if r := recover(); r != nil { err := errors.new(fmt.sprintf(system panic:%v, r)) errch <- err //此处将panic信息转为err返回,也可以按需求和异常等级进行处理 return } }() ........ }()} 3, 顺序问题
返回的列表元素的顺序,需要跟传参的列表顺序保持一致,这时我们需要定义个带序号的结构体
// 需要记录原始顺序的时候,定义个带编号的结构体 type orderwithseq struct { seq int orderitem order } //重写相关排序类型type byseq []orderwithseq func (a byseq) len() int { return len(a) } func (a byseq) swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a byseq) less(i, j int) bool { return a[i].seq < a[j].seq }// 调整返回结果orderch := make(chan orderwithseq, tasknum) //接收带序号的结构体//在执行任务时,加入序号for i:=0; i < tasknum; i++ { i:= i wg.add(1) go func() { ···· //组装返回结果 res := order{ name: num: + strconv.itoa(i), id: i, } orderch <-orderwithseq { seq: i, //带上i这个序号 orderitem: res, } }() //接收信息,也按带序号的结构体进行组装 orderseqlist := make([]orderwithseq, tasknum) for i:=0; i 标准模板如下:
自报式低功耗水文遥测系统的设计与实现
富士召开X Summit GLOBAL 2021峰会 发布三款镜头产品
威马借着与百度合作,要抢先落地AVP代客泊车功能
锂聚合物电池的工作原理是什么?
纸张在线检测设备的工作原理及技术参数
接口调用并发执行十个任务总结
信驰达发布基于Nordic nRF52833的BLE模块RF-BM-ND10
汽车芯片短缺缓解最新消息
真正无线充电方式:完全不用接触
英伟达推出三款Pascal架构的三款VR-Ready显卡!
英特尔发布新视觉处理单元(VPU),提供端到端人工智能(AI)解决方案
低功耗up监控电路MAX16072–MAX16074
罗技推出首款VR手写笔 与典型的SteamVR控制器类似
用于基因组学、转录组学和临床研究的综合NGS软件
蒸汽拖把好用吗?想购买先看这篇!
关于如何看待3D打印的分析介绍
SRPP校声胆前级,Vacuum tube pre-amplifier
螺旋板式换热器和翅片管式散热器有什么区别
4K花园携手合作伙伴共探5G创新新应用场景和多元商业模式
基于电压型磁链观测器的异步电机矢量控制学习