我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Golang编程并发工具库MapReduce使用实践

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Golang编程并发工具库MapReduce使用实践

环境

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

项目需求

处理数个约5MB的小文件

从源目录读取文件并拷贝到目标目录

计算源文件MD5和目标文件MD5进行对比,如不相同则报错并终止程序执行

mapReduce使用说明

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

需求实现

判断上下文是否中止 → 读取数据 → 写入数据 → 校验MD5

 func fnBuilder(name string) func() error {
   return func() error {
        // 判断上下文是否终止
        select {
        case <-ctx.Done():
          return ctx.Err()
        default:
        }
        // 读取源数据
        data, _err := os.ReadFile(filepath.Join(sourcePath, fileName))
        // 计算源数据MD5
        sourceMD5 := hash.Md5(data)
        // 获取名称
        fields := strings.Split(d.Name(), "-")
        // 目标文件路径
        distFilePath := filepath.Join(distPath, fileName)
        // 拷贝数据
        os.WriteFile(distFilePath, data, 0600)
        // 校验数据
        distData, _err := os.ReadFile(distFilePath)
        distMD5 := hash.Md5(distData)
        if !bytes.EqualFold(sourceMD5, distMD5) {
          return errors.New("md5校验失败")
        }
        return nil
      }
 }

业务逻辑

创建任务队列

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

执行方式1:MapReduce

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

执行方式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()
}

执行方式3:串行

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

运行结果

MapReduce

耗时 109220900 ns

{"file":"D:/go/class="lazy" data-src/filenamesSorter/main.go:44","func":"main.init.0","level":"info","msg":"并发处理(0-mapReduce 1-Sync.WaitGroup 2-不并发) 0","time":"2021-06-02T13:32:05+08:00"}
{"file":"D:/go/class="lazy" data-src/filenamesSorter/main.go:69","func":"main.main","level":"info","msg":"文件分类完毕","time":"2021-06-02T13:32:05+08:00","文件数":17,"耗时(ns)":109220900}

sync.WaitGroup

耗时 109798000 ns

{"file":"D:/go/class="lazy" data-src/filenamesSorter/main.go:44","func":"main.init.0","level":"info","msg":"并发处理(0-mapReduce 1-Sync.WaitGroup 2-不并发) 1","time":"2021-06-02T13:31:28+08:00"}
{"file":"D:/go/class="lazy" data-src/filenamesSorter/main.go:69","func":"main.main","level":"info","msg":"文件分类完毕","time":"2021-06-02T13:31:28+08:00","文件数":17,"耗时(ns)":109798000} 

串行

耗时 359307700 ns

{"file":"D:/go/class="lazy" data-src/filenamesSorter/main.go:44","func":"main.init.0","level":"info","msg":"并发处理(0-mapReduce 1-Sync.WaitGroup 2-不并发) 2","time":"2021-06-02T13:33:02+08:00"}
{"file":"D:/go/class="lazy" data-src/filenamesSorter/main.go:69","func":"main.main","level":"info","msg":"文件分类完毕","time":"2021-06-02T13:33:02+08:00","文件数":17,"耗时(ns)":359307700} 

结论

  • 在不严格的情况下,执行效率方面可以认为 mapReduce ≈ sync.WaitGroup
  • 易用性(包括并发和错误处理),mapReduce 完胜 sync.WaitGroup
  • mapReduce好用

引申阅读

通过MapReduce降低服务响应时间

以上就是Golang编程并发工具库MapReduce使用实践的详细内容,更多关于Golang并发工具库MapReduce的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Golang编程并发工具库MapReduce使用实践

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

高效并发编程:使用Golang WaitGroup的实践技巧

在Golang中,WaitGroup是用来管理并发任务的一个非常有用的工具。它可以用来等待一组并发任务完成之后再继续执行后续的代码。下面是一些使用WaitGroup的实践技巧,可以帮助你编写高效的并发程序:1. 添加任务到WaitGroup
2023-10-10

使用golang进行Select Channels Go并发式编程的最佳工具和库

使用Golang进行并发式编程时,可以使用以下工具和库来处理Select Channels:1. Goroutines:Goroutines 是 Golang 中的轻量级线程,可通过 go 关键字创建。Goroutines 可以并发执行,通
2023-10-20

高效并发编程实践:Golang中的Go WaitGroup使用技巧

在Golang中,WaitGroup是一个并发原语,可以用于等待一组goroutine完成任务。下面是一些使用WaitGroup的技巧,以实现高效并发编程。1. 创建WaitGroup对象:首先,需要创建一个WaitGroup对象,通常使用
2023-10-08

在golang中使用Select Channels Go并发式编程的最佳实践

在Golang中使用Select和Channels进行并发编程时,以下是一些最佳实践:1. 使用无缓冲的通道(unbuffered channels)来确保数据同步和顺序传递。无缓冲的通道会导致发送和接收操作同步进行,从而确保数据的正确传递
2023-10-10

Go WaitGroup和Golang并发编程的最佳实践

Go的WaitGroup是一种并发编程中非常有用的工具,用于等待一组goroutine完成其任务。在Go中,WaitGroup是一个计数信号量,用于等待一组goroutine完成任务。下面是使用WaitGroup和Go并发编程的最佳实践:1
2023-10-08

掌握使用golang进行Select Channels Go并发式编程的最佳实践

在使用Go进行并发式编程时,使用select语句可以有效地处理多个channel的读写操作。下面是一些使用select语句的最佳实践:1. 构造select语句:在使用select语句时,每个case语句都是一个channel操作,可以是读
2023-10-20

Golang函数并发编程:性能优化最佳实践

在 go 函数中实现并发编程性能优化,最佳实践包括:限制协程数量以避免资源争用;使用管道进行轻量级通信,避免数据竞争;并行处理任务,而非顺序执行;实战案例:使用并发爬虫高效处理数据。Golang 函数并发编程:性能优化最佳实践在 Go 语
Golang函数并发编程:性能优化最佳实践
2024-04-17

深入了解并实践golang中的Select Channels Go并发式编程

在Go语言中,可以使用select语句和通道(Channel)来进行并发式编程。通道(Channel)是用来在Go协程之间进行通信的一种方式。通过通道,可以安全地传递数据,实现协程之间的同步。在通道中发送数据使用`select语句用于处理多
2023-10-08

利用golang进行Select Channels Go并发式编程的实践指南

在Go语言中,使用Select语句可以实现并发式编程,它可以在多个channel之间进行选择操作,从而实现并发的输入/输出操作。下面是一个使用Select语句的实践指南:1. 创建多个channel:首先,我们需要创建多个channel,用
2023-10-09

Go并发编程sync.Cond的具体使用

目录简介详细介绍案例:Redis连接池注意点简介 Go 标准库提供 Cond 原语的目的是,为等待 / 通知场景下的并发问题提供支持。Cond 通常应用于等待某个条件的一组 goroutine,等条件变为 true 的时候,其中一个 gor
2022-06-07

Golang函数并发编程中的单元测试最佳实践

单元测试并发 go 函数的最佳实践包括:并行运行测试以加快执行速度。使用 t.parallel() 函数模拟并发环境。专注于测试特定并发条件,如数据竞争或死锁。使用辅助工具,如 go test -race 或 racetrackd,检测并发
Golang函数并发编程中的单元测试最佳实践
2024-04-17

使用Golang进行并发编程的示例

这篇文章给大家分享的是有关使用Golang进行并发编程的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Golang最擅长的就是并发编程,使用Golang可以很方便的进行并发编程。先看一段普通的代码packag
2023-06-14

golang函数在面向对象编程中工具和库的使用

go 语言函数在面向对象编程中扮演着以下角色:作为工具函数,可用于验证输入、执行计算和处理错误。作为面向对象编程库,提供特定领域的预构建功能,例如数学、字符串和网络操作。Go 语言函数:面向对象编程中的工具和库在 Go 语言的面向对象编程
golang函数在面向对象编程中工具和库的使用
2024-05-03

在golang项目中应用Select Channels Go并发式编程的实践经验

在Golang项目中使用Select和Channels进行并发式编程可以有效地实现并发控制和协作。以下是一些实践经验:1. 使用Channels传递数据:Channels是Golang中的并发原语,可以用于在不同的goroutine之间传递
2023-10-20

在golang项目中应用Select Channels Go并发式编程的最佳实践

在Go语言项目中,使用Select和Channels可以实现高效的并发式编程。下面是一些在Go项目中应用Select和Channels的最佳实践:1. 使用无缓冲Channels进行同步:无缓冲Channels是一种阻塞式的通信机制,可以用
2023-10-10

时间戳获取的最佳实践:Golang编程中的强大工具

Golang编程利器:时间戳获取的最佳实践引言:在软件开发中,时间戳是一个非常常见的概念。它是一个标识特定事件发生的数字值,通常表示自从某个参考时间点开始的毫秒数或纳秒数。在Golang中,处理时间戳的操作非常简单且高效。本文将介绍Gola
时间戳获取的最佳实践:Golang编程中的强大工具
2023-12-29

Golang并发编程:使用Go WaitGroup实现任务调度器

任务调度器是一种常见的并发编程模式,它用于同时执行多个任务并等待所有任务完成后再继续执行其他操作。在Golang中,可以使用sync.WaitGroup实现任务调度器。sync.WaitGroup是Golang提供的一个并发原语,用于等待一
2023-10-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录