網(wǎng)站首頁 編程語言 正文
環(huán)境
go version go1.16.4 windows/amd64
Intel(R) Core(TM) i7-7820HK CPU @ 2.90GHz 4核心8線程
項(xiàng)目需求
處理數(shù)個(gè)約5MB的小文件
從源目錄讀取文件并拷貝到目標(biāo)目錄
計(jì)算源文件MD5和目標(biāo)文件MD5進(jìn)行對(duì)比,如不相同則報(bào)錯(cuò)并終止程序執(zhí)行
mapReduce使用說明
go get -u github.com/tal-tech/go-zero
需求實(shí)現(xiàn)
判斷上下文是否中止 → 讀取數(shù)據(jù) → 寫入數(shù)據(jù) → 校驗(yàn)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)) // 計(jì)算源數(shù)據(jù)MD5 sourceMD5 := hash.Md5(data) // 獲取名稱 fields := strings.Split(d.Name(), "-") // 目標(biāo)文件路徑 distFilePath := filepath.Join(distPath, fileName) // 拷貝數(shù)據(jù) os.WriteFile(distFilePath, data, 0600) // 校驗(yàn)數(shù)據(jù) distData, _err := os.ReadFile(distFilePath) distMD5 := hash.Md5(distData) if !bytes.EqualFold(sourceMD5, distMD5) { return errors.New("md5校驗(yàn)失敗") } return nil } }
業(yè)務(wù)邏輯
創(chuàng)建任務(wù)隊(duì)列
type SourceMap = map[string]fs.DirEntry func CopyFileToDist(ctx context.Context, source SourceMap) (err error) { // 創(chuàng)建工作隊(duì)列 work := make([]func() error, 0, len(source)) for _name := range source { // 創(chuàng)建任務(wù) 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 } } }
運(yùn)行結(jié)果
MapReduce
耗時(shí) 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,"耗時(shí)(ns)":109220900}
sync.WaitGroup
耗時(shí) 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,"耗時(shí)(ns)":109798000}
串行
耗時(shí) 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,"耗時(shí)(ns)":359307700}
結(jié)論
- 在不嚴(yán)格的情況下,執(zhí)行效率方面可以認(rèn)為 mapReduce ≈ sync.WaitGroup
- 易用性(包括并發(fā)和錯(cuò)誤處理),mapReduce 完勝 sync.WaitGroup
- mapReduce好用
引申閱讀
通過MapReduce降低服務(wù)響應(yīng)時(shí)間
原文鏈接:https://blog.csdn.net/yes169yes123/article/details/117467920
相關(guān)推薦
- 2022-03-23 Linux和GNU系統(tǒng)的關(guān)系詳解_Linux
- 2022-03-30 C#數(shù)據(jù)類型轉(zhuǎn)換(顯式轉(zhuǎn)型、隱式轉(zhuǎn)型、強(qiáng)制轉(zhuǎn)型)_C#教程
- 2022-12-10 一文帶你快速了解C/C++標(biāo)準(zhǔn)庫(kù)中的ptrdiff_t_C 語言
- 2022-09-30 Python學(xué)習(xí)之pip包管理工具的使用_python
- 2022-11-03 React狀態(tài)管理器Rematch的使用詳解_React
- 2022-08-05 雪花算法工具類
- 2022-07-04 C#使用StreamReader和StreamWriter類讀寫操作文件_C#教程
- 2022-08-15 Property or field ‘xxx‘ cannot be found on object
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支