跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • [不懂就问] 请问这段 go 代码该如何优化
未分類
8 9 月 2020

[不懂就问] 请问这段 go 代码该如何优化

[不懂就问] 请问这段 go 代码该如何优化

資深大佬 : Aumujun 5

代码如下,目的是为了同时下载很多台交换机的配置,sws 里有多组业务的交换机,每个业务的每一台配置的下载我都要同时进行,下面的代码是我拍脑袋写下来的,目的达到了,但怎么看都不顺眼,我的 go 水平目前实在有限,求助各位指导一下。

func (s *swbka) downloadSwitchCfg(sws map[string]mulparam) {  wgp := sync.WaitGroup{}  wgp.Add(len(sws))  for secN, mulP := range sws {   go func(secName string, mulP mulparam) {     if _, err := os.Stat(secName); os.IsNotExist(err) {     err := os.Mkdir(secName, 0644)     if err != nil {      logrus.Fatal(err)     }    }    wg := sync.WaitGroup{}    wg.Add(len(mulP.profiles))    for _, profile := range mulP.profiles {     go func(sn string, pf param) {      err := s.downloadFile(sn, pf)      if err != nil {       logrus.Errorln(err)      }      wg.Done()     }(secName, profile)    }    wg.Wait()    wgp.Done()   }(secN, mulP)  }  wgp.Wait() } 

大佬有話說 (11)

  • 資深大佬 : GGGG430

    外层的 WaitGroup 可以理解为进程等待, 里层的 WaitGroup+go func 感觉没必要;
    或者这样简化一下
    “`
    func (s *swbka) downloadSwitchCfg(sws map[string]mulparam) {
    wgp := sync.WaitGroup{}
    for secN, mulP := range sws {
    if _, err := os.Stat(secName); os.IsNotExist(err) {
    if err := os.Mkdir(secName, 0644); err != nil {
    logrus.Fatal(err)
    continue
    }
    }
    wgp.Add(1)
    for _, profile := range mulP.profiles {
    go func(sn string, pf param, wg *sync.WaitGroup) {
    defer func() {
    wg.Done()
    }()
    err := s.downloadFile(sn, pf)
    if err != nil {
    logrus.Errorln(err)
    }
    }(secName, profile, &wgp)
    }
    }
    wgp.Wait()
    }
    “`

  • 主 資深大佬 : Aumujun

    @GGGG430 你这个看起来确实比我原来那个强太多了,发帖之后思考了一下,改成了下面这样

    “`golang
    func downloadFunc(s *swbka, wg *sync.WaitGroup, secName string, mulP mulparam) {
    if _, err := os.Stat(secName); os.IsNotExist(err) {
    err := os.Mkdir(secName, 0644)
    if err != nil {
    logrus.Fatal(err)
    }
    }
    for _, profile := range mulP.profiles {
    go func(sn string, pf param) {
    // err := s.downloadFile(sn, pf)
    err := s.downloadFileMock(sn, pf)
    wg.Done()
    if err != nil {
    logrus.Errorln(err)
    }
    }(secName, profile)
    }
    }

    func (s *swbka) downloadSwitchCfg(sws map[string]mulparam) {
    wg := sync.WaitGroup{}
    // wg.Add(len(sws))
    for secN, mulP := range sws {
    wg.Add(len(mulP.profiles))
    go downloadFunc(s, &wg, secN, mulP)
    }
    wg.Wait()
    }
    “`

    不过看了你的回复后,感觉获得了新的启示

  • 資深大佬 : iwdmb

    “`
    func (s *swbka) downloadSwitchCfg(sws map[string]mulparam) {
    wgp := sync.WaitGroup{}
    wgp.Add(len(sws))

    for secName, mulP := range sws {
    go func(secName string, mulP mulparam) {
    if _, err := os.Stat(secName); os.IsNotExist(err) {
    err := os.Mkdir(secName, 0644)
    if err != nil {
    logrus.Fatal(err)
    }
    }

    wg := sync.WaitGroup{}
    wg.Add(len(mulP.profiles))
    for _, profile := range mulP.profiles {
    go func(sn string, pf param) {
    err := s.downloadFile(sn, pf)
    if err != nil {
    logrus.Errorln(err)
    }
    wg.Done()
    }(secName, profile)
    }

    wg.Wait()
    wgp.Done()
    }(secN, mulP)
    }
    wgp.Wait()
    }
    “`

  • 資深大佬 : iwdmb

    https://play.golang.com/p/3bttswbY1ho

  • 資深大佬 : iwdmb

    上面兩個貼錯

    這個試試看: https://play.golang.com/p/3WyN4JrDmbQ

  • 主 資深大佬 : Aumujun

    @iwdmb 感谢大哥的回复,这个版本确实好看很多,现在已经用上了。

    @GGGG430 两位的思路大体差不多,拿过来稍微改改就可以了。

  • 主 資深大佬 : Aumujun

    非常感谢,优化成这种程度我已经满足了,感谢两位大哥的指点

  • 資深大佬 : heimeil

    https://play.golang.com/p/av9GYVvu1VU

  • 資深大佬 : zarte

    我觉得可以加下限制协程数。

  • 資深大佬 : situs

    你的 Done()应该用 defer,你现在是顺序执行的,如果上面 err 了,你这协程 done 不了了

  • 資深大佬 : dafsic

    你这个是多协程处理同样的任务的,没有最多协程的数的限制。https://github.com/90634/gotaskengine,我线上环境用的,多协程处理多任务的。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具