婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > go goroutine 怎樣進行錯誤處理

go goroutine 怎樣進行錯誤處理

熱門標簽:400手機電話免費辦理 百度地圖標注位置網站 上海企業外呼系統排名 開通400電話申請流程 智能語音電銷的機器人 如何利用高德地圖標注家 揚州電銷外呼系統軟件 武漢百應人工智能電銷機器人 電腦外呼系統輻射大嗎

前言

在 Go 語言程序開發中,goroutine 的使用是比較頻繁的,因此在日常編碼的時候 goroutine 里的錯誤處理,怎么做會比較好呢?

一般我們的業務代碼如下:

func main() {
 var wg sync.WaitGroup
 wg.Add(2)
 go func() {
  //... 業務邏輯
  wg.Done()
 }()
 go func() {
  //... 業務邏輯
  wg.Done()
 }()
 wg.Wait()
}

在上面的代碼中,我們運行了多個 goroutine,每個協程又是單獨行動的,想要拋出 error 錯誤信息,也不怎么明智。

通過錯誤日志記錄

常用的第一種方法:通過把錯誤記錄寫入到日志文件中,再結合相關的 logtail 進行采集和梳理。

但這又會引入新的問題,那就是調用錯誤日志的方法寫的到處都是,代碼結構也比較亂、不直觀。

最重要的是無法針對 error 做特定的邏輯處理和流轉。

利用 channel 傳輸

大家可能會想到 Go 的經典哲學:不要通過共享內存來通信,而是通過通信來實現內存共享(Do not communicate by sharing memory; instead, share memory by communicating)。

第二種方法:利用 channel 來傳輸多個 goroutine 中的 errors:

func main() {
 cherrors := make(chan error)
 wgDone := make(chan bool)

 var wg sync.WaitGroup
 wg.Add(2)
 go func() {
  //... 業務邏輯
  wg.Done()
 }()
 go func() {
  //... 業務邏輯
  err := returnErr()
  if err != nil {
   cherrors - err
  }
  wg.Done()
 }()
 go func() {
  wg.Wait()
  close(wgDone)
 }()

 select {
 case -wgDone:
  break
 case err := -cherrors:
  close(cherrors)
  fmt.Println(err)
 }

 time.Sleep(time.Second)
}

func returnErr() error {
 return errors.New("出錯啦。。我是錯誤信息")
}

雖然使用 channel 后已經方便了不少,但編寫 channel 還要關心一些非業務向的邏輯。

使用 sync/errgroup

第三種方法,就是使用官方提供的 golang.org/x/sync/errgroup 標準庫:

type Group
    func WithContext(ctx context.Context) (*Group, context.Context)
    func (g *Group) Go(f func() error)
    func (g *Group) Wait() error
  • Go:啟動一個協程,在新的 goroutine 中調用給定的函數。
  • Wait:等待協程結束,直到 Go 方法中的所有函數調用都返回,然后返回其中第一個非零錯誤(如果有錯誤的話)。

結合其特性能夠非常便捷的針對多 goroutine 進行錯誤處理:

func main() {
 group := new(errgroup.Group)

 nums := []int{-1, 0, 1}
 for _, num := range nums {
  num := num
  group.Go(func() error {
   res, err := output(num)
   fmt.Println(res)
   return err
  })
 }

 if err := group.Wait(); err != nil {
  fmt.Println("Get errors: ", err)
 } else {
  fmt.Println("Get all num successfully!")
 }
}

func output(num int) (int, error) {
 if num  0 {
  return 0, errors.New("math: square root error!")
 }
 return num, nil
}

每啟動一個新的 goroutine 都直接使用 Group.Go 方法,在等待和錯誤處理上使用 Group.Wait 方法。

這種方法進行錯誤處理的好處是不需要關注非業務邏輯的控制代碼,比較簡潔明了。

總結

在 Go 語言中,goroutine 是一種常用的方法,為此我們需要更了解 goroutine 的一系列相關知識,像是 context、error處理等

在團隊開發中,統一一定的規范,這樣的代碼閱讀起來就會比較明朗,一些隱藏很深的 Bug 也會減少很多。

到此這篇關于go goroutine 怎樣進行錯誤處理的文章就介紹到這了,更多相關go goroutine 錯誤處理內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang try catch與錯誤處理的實現
  • 詳解Go語言的錯誤處理和資源管理
  • 詳解Go多協程并發環境下的錯誤處理
  • Golang中重復錯誤處理的優化方法
  • Golang巧用defer進行錯誤處理的方法
  • Go語言中更優雅的錯誤處理
  • Go語言中錯誤處理實例分析
  • GO語言標準錯誤處理機制error用法實例

標簽:江西 嘉峪關 張掖 延邊 宜賓 武漢 新余 黑龍江

巨人網絡通訊聲明:本文標題《go goroutine 怎樣進行錯誤處理》,本文關鍵詞  goroutine,怎樣,進行,錯誤,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《go goroutine 怎樣進行錯誤處理》相關的同類信息!
  • 本頁收集關于go goroutine 怎樣進行錯誤處理的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 桂东县| 贡觉县| 武邑县| 丹寨县| 威海市| 黄平县| 乌兰县| 芜湖县| 陆丰市| 丹巴县| 林州市| 平原县| 潜江市| 南平市| 益阳市| 桐城市| 宜章县| 紫金县| 洛扎县| 平昌县| 黄骅市| 富源县| 广南县| 大冶市| 西华县| 沙田区| 雅江县| 临泉县| 秀山| 同心县| 孙吴县| 二连浩特市| 乐平市| 凯里市| 青岛市| 澄城县| 滕州市| 乐至县| 二手房| 长泰县| 望江县|