0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

接口調(diào)用并發(fā)執(zhí)行十個任務總結

馬哥Linux運維 ? 來源:網(wǎng)絡整理 ? 2023-11-15 10:37 ? 次閱讀

需求

一個接口調(diào)用時,接收到一個列表,十個元素,需要并發(fā)執(zhí)行十個任務,每個任務都要返回執(zhí)行的結果和異常,然后對返回的結果裝填到一個切片列表里,統(tǒng)一返回結果。

需要協(xié)程處理的結構體

type Order struct {  
  Name string `json:"name"`  
  Id int `json:"id"`  
}

確定通道數(shù)量

一般按入?yún)⒌男枰幚淼脑財?shù)量為準

taskNum:=10

初始化通道

orderCh := make(chan Order, taskNum) //接收返回的結果
errCh:=make(chanerror,taskNum)//接收返回的異常

發(fā)起執(zhí)行,我們使用sync.WaitGroup來監(jiān)聽執(zhí)行情況

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()?//等待所有任務執(zhí)行完畢

使用for-select接收執(zhí)行結果

orderList := make([]Order, taskNum)
for i:=0; i

1,超時問題

任務執(zhí)行過程中,需要控制每個任務的執(zhí)行時間,不能超過一定范圍,我們用定時器來解決這個問題

timeoutTime := time.Second * 3  //超時時間
taskTimer := time.NewTimer(timeoutTime) //初始化定時器
orderList := make([]Order, taskNum)
for i:=0; i

2, 協(xié)程panic問題

主程序是無法捕捉協(xié)程內(nèi)的panic,因此如果不手動處理,就會發(fā)生協(xié)程內(nèi)panic導致整個程序中止的情況,我們在defer里處理

for i:=0; i < taskNum; i++ {
   wg.Add(1)
   go func() {
     defer func () {
      wg.Done()
      //協(xié)程內(nèi)單獨捕捉異常  
      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  
}
// 調(diào)整返回結果
orderCh := make(chan OrderWithSeq, taskNum) //接收帶序號的結構體
//在執(zhí)行任務時,加入序號
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{}
//在執(zhí)行任務時,加入序號
for i:=0; i < taskNum; i++ {
   i:= i
   wg.Add(1)
   go func() {
     defer func () {
      wg.Done()
      //協(xié)程內(nèi)單獨捕捉異常  
      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
                                        
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8447

    瀏覽量

    150720
  • 定時器
    +關注

    關注

    23

    文章

    3231

    瀏覽量

    114327

原文標題:總結

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    EMC的十個知識問答

    EMC的十個為什么, 為什么要對產(chǎn)品做電磁兼容設計?在電磁兼容領域,為什么總是用分貝(dB)的單位描述?為什么頻譜分析儀不能觀測靜電放電等瞬態(tài)干擾?
    發(fā)表于 11-28 10:58 ?1189次閱讀

    請問一協(xié)調(diào)器連接十個終端,如何能獲取十個終端的短地址?

    本帖最后由 一只耳朵怪 于 2018-5-24 14:22 編輯 一協(xié)調(diào)器連接十個終端,如何能獲取十個終端的短地址,求思路
    發(fā)表于 05-22 08:57

    ECG十個電極和12導聯(lián)

    ECG十個電極和12導聯(lián)1.對ECG獲取心電圖信息不是很了解,ECG只有十個電極為什么稱作12導聯(lián)?電極和導聯(lián)之間有什么關聯(lián)?2.什么叫做右腳驅(qū)動?為什么不能用左腳?3.除了PPG、ECG、還有BCG技術,如果做心率的檢測用哪種技術更好?
    發(fā)表于 12-08 16:31

    任務編程多任務處理是指什么

    。多任務操作系統(tǒng)使用某種調(diào)度策略支持多個任務并發(fā)執(zhí)行。每個任務被創(chuàng)建時分配時間片(幾到上百毫秒
    發(fā)表于 12-22 08:30

    數(shù)碼攝像頭的十個故障分析案例

    數(shù)碼攝像頭的十個故障分析案例 1.找不到攝像頭故障現(xiàn)象 一臺電腦檢測不到新裝的USB接口的攝像頭。分析及處理 先查操作系統(tǒng),再查BIOS、USB接口及安裝有
    發(fā)表于 05-17 16:44 ?80次下載

    選用LED驅(qū)動電源的十個要點

    選用LED驅(qū)動電源的十個要點,如何明智地選擇適合驅(qū)動LED的電源,是每位工程師在設計時都關心的問題。
    發(fā)表于 02-15 15:35 ?1375次閱讀

    開關電源技術的十個關注點

    開關電源的相關知識學習教材資料——開關電源技術的十個關注點
    發(fā)表于 09-20 15:44 ?0次下載

    Dispatch Queue任務執(zhí)行與Dispatch Source

    導讀本文為讀《Concurrency Programming Guide》筆記第三篇,在對OS X和iOS應用開發(fā)中實現(xiàn)任務異步執(zhí)行的技術、注意事項、Operation與Dispatch
    發(fā)表于 10-11 11:54 ?0次下載

    實施MES系統(tǒng)能為企業(yè)解決的十個問題資料分析

    實施MES系統(tǒng)能為企業(yè)解決的十個問題
    發(fā)表于 01-04 15:50 ?7次下載

    十個問題帶你了解和掌握java HashMap

    本文檔內(nèi)容介紹了十個問題帶你了解和掌握java HashMap及源代碼,供參考
    發(fā)表于 03-12 15:41 ?0次下載

    人工智能和人類智能的十個不同之處

    人工智能和人類智能究竟有何不同之處呢?在本文中Sabine Hossenfelder 就從十個方面分析了這兩者間的不同。
    的頭像 發(fā)表于 05-04 09:10 ?5567次閱讀

    智慧城市成功的十個觀察結果

    過去幾年,全球宣布了數(shù)十個智慧城市項目。早期采用者已經(jīng)在實施他們的智慧城市計劃。
    發(fā)表于 05-24 11:25 ?868次閱讀

    TCP/IP十個問題

    本文整理了一些TCP/IP協(xié)議簇中需要必知必會的大問題,既是面試高頻問題,又是程序員必備基礎素養(yǎng)。 TCP/IP十個問題 一、TCP/IP模型TCP/IP協(xié)議模型(Transmission
    的頭像 發(fā)表于 11-04 14:46 ?2395次閱讀

    部署無線AP的十個注意事項

    部署無線AP的十個注意事項
    發(fā)表于 10-09 14:21 ?6次下載

    NVIDIA Triton 系列文章(10):模型并發(fā)執(zhí)行

    (concurrent model execution)的調(diào)試,這是提升 Triton 服務器性能的最基本任務。? Triton 服務器支持的模型并發(fā)能力,包括一模型并發(fā)多個推理實例
    的頭像 發(fā)表于 01-05 11:55 ?1075次閱讀