欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang編程并發(fā)工具庫MapReduce使用實踐

 更新時間:2022年04月29日 09:50:59   作者:EvaCcino  
這篇文章主要為大家介紹了Golang并發(fā)工具庫MapReduce的使用實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

環(huán)境

go version go1.16.4 windows/amd64
Intel(R) Core(TM) i7-7820HK CPU @ 2.90GHz 4核心8線程

項目需求

處理數(shù)個約5MB的小文件

從源目錄讀取文件并拷貝到目標目錄

計算源文件MD5和目標文件MD5進行對比,如不相同則報錯并終止程序執(zhí)行

mapReduce使用說明

go get -u github.com/tal-tech/go-zero

需求實現(xiàn)

判斷上下文是否中止 → 讀取數(shù)據(jù) → 寫入數(shù)據(jù) → 校驗MD5

 func fnBuilder(name string) func() error {
   return func() error {
        // 判斷上下文是否終止
        select {
        case <-ctx.Done():
          return ctx.Err()
        default:
        }
        // 讀取源數(shù)據(jù)
        data, _err := os.ReadFile(filepath.Join(sourcePath, fileName))
        // 計算源數(shù)據(jù)MD5
        sourceMD5 := hash.Md5(data)
        // 獲取名稱
        fields := strings.Split(d.Name(), "-")
        // 目標文件路徑
        distFilePath := filepath.Join(distPath, fileName)
        // 拷貝數(shù)據(jù)
        os.WriteFile(distFilePath, data, 0600)
        // 校驗數(shù)據(jù)
        distData, _err := os.ReadFile(distFilePath)
        distMD5 := hash.Md5(distData)
        if !bytes.EqualFold(sourceMD5, distMD5) {
          return errors.New("md5校驗失敗")
        }
        return nil
      }
 }

業(yè)務邏輯

創(chuàng)建任務隊列

type SourceMap = map[string]fs.DirEntry
func CopyFileToDist(ctx context.Context, source SourceMap) (err error) {
  // 創(chuàng)建工作隊列
  work := make([]func() error, 0, len(source))
  for _name := range source {
    // 創(chuàng)建任務
    work = append(work, fnBuilder(_name))
  }
  switch concurrency {
  default:
    // mapReduce
  case 1:
    // sync.waitGroup
  case 2:
    // 串行
  }
}

執(zhí)行方式1:MapReduce

 func() {
    if err = mr.Finish(work...); err != nil {
      return err
    }
 }

執(zhí)行方式2:sync.WaitGroup

func() {
    var wg sync.WaitGroup
    wg.Add(len(work))
    for k := range work {
      go func(index int) {
        defer wg.Done()
        if err = work[index](); err != nil {
          log.Errorln(err)
          return
        }
      }(k)
    }
    wg.Wait()
}

執(zhí)行方式3:串行

func() {
    for _, fn := range work {
      if err = fn(); err != nil {
        return err
      }
    }
} 

運行結果

MapReduce

耗時 109220900 ns

{"file":"D:/go/src/filenamesSorter/main.go:44","func":"main.init.0","level":"info","msg":"并發(fā)處理(0-mapReduce 1-Sync.WaitGroup 2-不并發(fā)) 0","time":"2021-06-02T13:32:05+08:00"}
{"file":"D:/go/src/filenamesSorter/main.go:69","func":"main.main","level":"info","msg":"文件分類完畢","time":"2021-06-02T13:32:05+08:00","文件數(shù)":17,"耗時(ns)":109220900}

sync.WaitGroup

耗時 109798000 ns

{"file":"D:/go/src/filenamesSorter/main.go:44","func":"main.init.0","level":"info","msg":"并發(fā)處理(0-mapReduce 1-Sync.WaitGroup 2-不并發(fā)) 1","time":"2021-06-02T13:31:28+08:00"}
{"file":"D:/go/src/filenamesSorter/main.go:69","func":"main.main","level":"info","msg":"文件分類完畢","time":"2021-06-02T13:31:28+08:00","文件數(shù)":17,"耗時(ns)":109798000} 

串行

耗時 359307700 ns

{"file":"D:/go/src/filenamesSorter/main.go:44","func":"main.init.0","level":"info","msg":"并發(fā)處理(0-mapReduce 1-Sync.WaitGroup 2-不并發(fā)) 2","time":"2021-06-02T13:33:02+08:00"}
{"file":"D:/go/src/filenamesSorter/main.go:69","func":"main.main","level":"info","msg":"文件分類完畢","time":"2021-06-02T13:33:02+08:00","文件數(shù)":17,"耗時(ns)":359307700} 

結論

  • 在不嚴格的情況下,執(zhí)行效率方面可以認為 mapReduce ≈ sync.WaitGroup
  • 易用性(包括并發(fā)和錯誤處理),mapReduce 完勝 sync.WaitGroup
  • mapReduce好用

引申閱讀

通過MapReduce降低服務響應時間

以上就是Golang編程并發(fā)工具庫MapReduce使用實踐的詳細內容,更多關于Golang并發(fā)工具庫MapReduce的資料請關注腳本之家其它相關文章!

相關文章

  • Golang利用compress/flate包來壓縮和解壓數(shù)據(jù)

    Golang利用compress/flate包來壓縮和解壓數(shù)據(jù)

    在處理需要高效存儲和快速傳輸?shù)臄?shù)據(jù)時,數(shù)據(jù)壓縮成為了一項不可或缺的技術,Go語言的compress/flate包為我們提供了對DEFLATE壓縮格式的原生支持,本文將深入探討compress/flate包的使用方法,揭示如何利用它來壓縮和解壓數(shù)據(jù),并提供實際的代碼示例,需要的朋友可以參考下
    2024-08-08
  • Go 阻塞的實現(xiàn)示例

    Go 阻塞的實現(xiàn)示例

    Go語言提供了多種同步和通信機制,可以用于實現(xiàn)阻塞的效果,本文主要介紹了Go 阻塞的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • GO語言框架快速集成日志模塊的操作方法

    GO語言框架快速集成日志模塊的操作方法

    zap是一個可以在go項目中進行快速,?結構化且分級的日志記錄包,?git?star數(shù)高達16.3k,?Git?項目地址,?在各大公司項目中被廣泛使用,這篇文章主要介紹了GO語言框架中如何快速集成日志模塊,需要的朋友可以參考下
    2022-07-07
  • 多階段構建優(yōu)化Go?程序Docker鏡像

    多階段構建優(yōu)化Go?程序Docker鏡像

    這篇文章主要為大家介紹了多階段構建優(yōu)化Go?程序Docker鏡像,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go語言實現(xiàn)配置熱加載的方法分享

    Go語言實現(xiàn)配置熱加載的方法分享

    web項目,經常需要熱啟動各種各樣的配置信息,一旦這些服務發(fā)生變更,我們需要重新啟動web server,以使配置生效,實現(xiàn)配置熱加載,本文為大家整理了幾個方法實現(xiàn)這個需求,需要的可以參考下
    2023-05-05
  • Golang Gin框架實現(xiàn)文件下載功能的示例代碼

    Golang Gin框架實現(xiàn)文件下載功能的示例代碼

    本文主要介紹了Golang Gin框架實現(xiàn)文件下載功能的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 關于Go你不得不知道的一些實用小技巧

    關于Go你不得不知道的一些實用小技巧

    開發(fā)語言上Go成為高并發(fā)業(yè)務開發(fā)的主流語言,再加上云原生技術底座的驅動,Go語言風光無限,下面這篇文章主要給大家介紹了關于Go你不得不知道的一些實用小技巧,需要的朋友可以參考下
    2022-11-11
  • Go語言實現(xiàn)字符串切片賦值的方法小結

    Go語言實現(xiàn)字符串切片賦值的方法小結

    這篇文章主要給大家介紹了Go語言實現(xiàn)字符串切片賦值的兩種方法,分別是在for循環(huán)的range中以及在函數(shù)的參數(shù)傳遞中實現(xiàn),有需要的朋友們可以根據(jù)自己的需要選擇使用。下面來一起看看吧。
    2016-10-10
  • golang判斷文本文件是否是BOM格式的方法詳解

    golang判斷文本文件是否是BOM格式的方法詳解

    在Go語言中,我們可以通過讀取文本文件的前幾個字節(jié)來識別它是否是BOM格式的文件,BOM(Byte Order Mark)是UTF編碼標準中的一部分,用于標示文本文件的編碼順序,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • golang?使用chromedp獲取頁面請求日志network

    golang?使用chromedp獲取頁面請求日志network

    這篇文章主要為大家介紹了golang?使用chromedp獲取頁面請求日志network方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11

最新評論