「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?

引言
go具有高并发的特性 , 可更充分的利用机器上的CPU , 当开启多个协程时 , 如何保证线程的安全性 。 每个协程之间是相对独立的 , 如何在协程之间共享数据 , 进而保证数据的一致性 , 其中的一个方案是加互斥锁 。
在标准库sync包中提供了两个互斥类型:sync.Mutex与sync.RWMutex , 本文的代码中使用的是sync.Mutex类型提供的两个方法Lock与Unlock 。 通过加互斥锁 , 可保证数据在多个协程间的一致性 , 增强线程安全 。
在线上生产环境中 , 每天都会产生大量的日志数据文件 , 对日志文件的过滤和分析是十分重要的 , 尤其在线上出现问题时 , 日志文件中的数据是解决问题的关键 。 这一点对支付系统来说尤为重要 。
【「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?】一般来说单个日志文件的大小都很大 , 小的几G , 大的有几十G , 有的甚至更大 , 如何对单个大日志文件进行数据分析和过滤 , 如何以最快的速度进行处理 , go的高并发正适应这种场景 。 定义数据结构
创建数据结构FilterMap , 由互斥量和映射构成 。 有一个地方需要注意 , 互斥量在第一次使用之后 , 不能被复制 。 这就决定mutex必须是指针类型 。
该结构有两个方法 , NewFilterMap具有“构造函数”的功能 , 主要用来初始化;Increment则对过滤时符合条件的内容进行计数 。 在这里使用互斥锁 , 当fm被锁定时 , 调用它的协程会被阻塞 , 直到它被解除锁定 。
「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
文章图片
从命令行接收日志文件的绝对路径
使用标准库flag包提供的方法 , 从命令行参数中获得日志文件的绝对路径 。
「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
文章图片
按行循环读取日志文件的数据
新建一个协程 , 专门用来将数据按行写入管道里 , 当日志文件的数据读取完毕之后 , 关闭管道 。
「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
文章图片
创建多个协程 , 对日志数据进行过滤
用多个协程 , 同时高并发运行 , 来处理过滤数据 。
「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
文章图片
遍历事件管道和输出统计结果
「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
文章图片
主函数代码
「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
文章图片
运行该程序
「瑾说编程」怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
文章图片