需求
一個接口調用時,接收到一個列表,十個元素,需要并發執行十個任務,每個任務都要返回執行的結果和異常,然后對返回的結果裝填到一個切片列表里,統一返回結果。
需要協程處理的結構體
type Order struct {
Name string `json:"name"`
Id int `json:"id"`
}
確定通道數量
一般按入參的需要處理的元素數量為準
taskNum:=10
初始化通道
orderCh := make(chan Order, taskNum) //接收返回的結果 errCh:=make(chanerror,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; i1,超時問題
任務執行過程中,需要控制每個任務的執行時間,不能超過一定范圍,我們用定時器來解決這個問題
timeoutTime := time.Second * 3 //超時時間 taskTimer := time.NewTimer(timeoutTime) //初始化定時器 orderList := make([]Order, taskNum) for i:=0; i2, 協程panic問題
主程序是無法捕捉協程內的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總結
標準模板如下:
type Order struct { Name string `json:"name"` Id int `json:"id"` } // 需要記錄原始順序的時候,定義個帶編號的結構體 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 } taskNum := 10 orderCh := make(chan OrderWithSeq, taskNum) //接收帶序號的結構體 errCh := make(chan error, taskNum) //接收返回的異常 wg := sync.WaitGroup{} //在執行任務時,加入序號 for i:=0; i < taskNum; i++ { i:= 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 } }() //組裝返回結果 res := Order{ Name: "num: " + strconv.Itoa(i), Id: i, } orderCh <-OrderWithSeq { Seq: i, //帶上i這個序號 OrderItem: res, } }() wg.Wait() //接收信息,也按帶序號的結構體進行組裝 orderSeqList := make([]OrderWithSeq, taskNum) timeoutTime := time.Second * 3 taskTimer := time.NewTimer(timeoutTime) for i:=0; i
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
接口
+關注
關注
33文章
9520瀏覽量
157036 -
定時器
+關注
關注
23文章
3368瀏覽量
123627
原文標題:總結
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
EMC的十個知識問答
EMC的十個為什么, 為什么要對產品做電磁兼容設計?在電磁兼容領域,為什么總是用分貝(dB)的單位描述?為什么頻譜分析儀不能觀測靜電放電等瞬態干擾?
發表于 11-28 10:58
?1375次閱讀
請問一個協調器連接十個終端,如何能獲取十個終端的短地址?
本帖最后由 一只耳朵怪 于 2018-5-24 14:22 編輯
一個協調器連接十個終端,如何能獲取十個終端的短地址,求思路
發表于 05-22 08:57
ECG十個電極和12導聯
ECG十個電極和12導聯1.對ECG獲取心電圖信息不是很了解,ECG只有十個電極為什么稱作12導聯?電極和導聯之間有什么關聯?2.什么叫做右腳驅動?為什么不能用左腳?3.除了PPG、ECG、還有BCG技術,如果做心率的檢測用哪種技術更好?
發表于 12-08 16:31
數碼攝像頭的十個故障分析案例
數碼攝像頭的十個故障分析案例
1.找不到攝像頭故障現象 一臺電腦檢測不到新裝的USB接口的攝像頭。分析及處理 先查操作系統,再查BIOS、USB接口及安裝有
發表于 05-17 16:44
?80次下載
Dispatch Queue任務執行與Dispatch Source
導讀本文為讀《Concurrency Programming Guide》筆記第三篇,在對OS X和iOS應用開發中實現任務異步執行的技術、注意事項、Operation與Dispatch
發表于 10-11 11:54
?0次下載
人工智能和人類智能的十個不同之處
人工智能和人類智能究竟有何不同之處呢?在本文中Sabine Hossenfelder 就從十個方面分析了這兩者間的不同。
TCP/IP十個問題
本文整理了一些TCP/IP協議簇中需要必知必會的十大問題,既是面試高頻問題,又是程序員必備基礎素養。 TCP/IP十個問題 一、TCP/IP模型TCP/IP協議模型(Transmission
NVIDIA Triton 系列文章(10):模型并發執行
(concurrent model execution)的調試,這是提升 Triton 服務器性能的最基本任務。? Triton 服務器支持的模型并發能力,包括一個模型并發多個推理實例
接口調用并發執行十個任務總結
評論