chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

接口調(diào)用并發(fā)執(zhí)行十個(gè)任務(wù)總結(jié)

馬哥Linux運(yùn)維 ? 來源:網(wǎng)絡(luò)整理 ? 2023-11-15 10:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

需求

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

需要協(xié)程處理的結(jié)構(gòu)體

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

確定通道數(shù)量

一般按入?yún)⒌男枰幚淼脑財(cái)?shù)量為準(zhǔn)

taskNum:=10

初始化通道

orderCh := make(chan Order, taskNum) //接收返回的結(jié)果
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 {//模擬當(dāng)i=3的時(shí)候,返回一個(gè)異常
         err := errors.New("there is an error")
         errCh <- err 
         return
     }
     //組裝返回結(jié)果
     res := Order{  
         Name: "num: " + strconv.Itoa(i),  
         Id: i,  
         }
     orderCh <- res    
  }()
}
wg.Wait()?//等待所有任務(wù)執(zhí)行完畢

使用for-select接收?qǐng)?zhí)行結(jié)果

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

1,超時(shí)問題

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

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

2, 協(xié)程panic問題

主程序是無法捕捉協(xié)程內(nèi)的panic,因此如果不手動(dòng)處理,就會(huì)發(fā)生協(xié)程內(nèi)panic導(dǎo)致整個(gè)程序中止的情況,我們?cè)赿efer里處理

for i:=0; i < taskNum; i++ {
   wg.Add(1)
   go func() {
     defer func () {
      wg.Done()
      //協(xié)程內(nèi)單獨(dú)捕捉異常  
      if r := recover(); r != nil {  
        err := errors.New(fmt.Sprintf("System panic:%v", r))  
        errCh <- err //此處將panic信息轉(zhuǎn)為err返回,也可以按需求和異常等級(jí)進(jìn)行處理
        return
      }
     }()
   ........
  }()
}

3, 順序問題

返回的列表元素的順序,需要跟傳參的列表順序保持一致,這時(shí)我們需要定義個(gè)帶序號(hào)的結(jié)構(gòu)體

// 需要記錄原始順序的時(shí)候,定義個(gè)帶編號(hào)的結(jié)構(gòu)體  
type OrderWithSeq struct {  
    Seq int  
    OrderItem Order  
}  
//重寫相關(guān)排序類型
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)整返回結(jié)果
orderCh := make(chan OrderWithSeq, taskNum) //接收帶序號(hào)的結(jié)構(gòu)體
//在執(zhí)行任務(wù)時(shí),加入序號(hào)
for i:=0; i < taskNum; i++ {
   i:= i
   wg.Add(1)
   go func() {
     ····
     //組裝返回結(jié)果
     res := Order{  
         Name: "num: " + strconv.Itoa(i),  
         Id: i,  
         }
     orderCh <-OrderWithSeq {
         Seq: i, //帶上i這個(gè)序號(hào)
         OrderItem: res,
     }
  }()
 //接收信息,也按帶序號(hào)的結(jié)構(gòu)體進(jìn)行組裝
 orderSeqList := make([]OrderWithSeq, taskNum)
 for i:=0; i

總結(jié)

標(biāo)準(zhǔn)模板如下:

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


// 需要記錄原始順序的時(shí)候,定義個(gè)帶編號(hào)的結(jié)構(gòu)體  
type OrderWithSeq struct {  
    Seq int  
    OrderItem Order  
}  
//重寫相關(guān)排序類型
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) //接收帶序號(hào)的結(jié)構(gòu)體
errCh := make(chan error, taskNum) //接收返回的異常
wg := sync.WaitGroup{}
//在執(zhí)行任務(wù)時(shí),加入序號(hào)
for i:=0; i < taskNum; i++ {
   i:= i
   wg.Add(1)
   go func() {
     defer func () {
      wg.Done()
      //協(xié)程內(nèi)單獨(dú)捕捉異常  
      if r := recover(); r != nil {  
        err := errors.New(fmt.Sprintf("System panic:%v", r))  
        errCh <- err //此處將panic信息轉(zhuǎn)為err返回,也可以按需求和異常等級(jí)進(jìn)行處理
        return
      }
     }()
     //組裝返回結(jié)果
     res := Order{  
         Name: "num: " + strconv.Itoa(i),  
         Id: i,  
         }
     orderCh <-OrderWithSeq {
         Seq: i, //帶上i這個(gè)序號(hào)
         OrderItem: res,
     }
  }()
 wg.Wait()
  //接收信息,也按帶序號(hào)的結(jié)構(gòu)體進(jìn)行組裝
 orderSeqList := make([]OrderWithSeq, taskNum)
 timeoutTime := time.Second * 3 
 taskTimer := time.NewTimer(timeoutTime)
 for i:=0; i
                                        
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9269

    瀏覽量

    155452
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3347

    瀏覽量

    120959

原文標(biāo)題:總結(jié)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    EMC的十個(gè)知識(shí)問答

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

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

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

    ECG十個(gè)電極和12導(dǎo)聯(lián)

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

    任務(wù)編程多任務(wù)處理是指什么

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

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

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

    選用LED驅(qū)動(dòng)電源的十個(gè)要點(diǎn)

    選用LED驅(qū)動(dòng)電源的十個(gè)要點(diǎn),如何明智地選擇適合驅(qū)動(dòng)LED的電源,是每位工程師在設(shè)計(jì)時(shí)都關(guān)心的問題。
    發(fā)表于 02-15 15:35 ?1636次閱讀

    開關(guān)電源技術(shù)的十個(gè)關(guān)注點(diǎn)

    開關(guān)電源的相關(guān)知識(shí)學(xué)習(xí)教材資料——開關(guān)電源技術(shù)的十個(gè)關(guān)注點(diǎn)
    發(fā)表于 09-20 15:44 ?0次下載

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

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

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

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

    十個(gè)問題帶你了解和掌握java HashMap

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

    人工智能和人類智能的十個(gè)不同之處

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

    智慧城市成功的十個(gè)觀察結(jié)果

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

    TCP/IP十個(gè)問題

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

    部署無線AP的十個(gè)注意事項(xiàng)

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

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

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