『瑾说编程』怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
引言
go具有高并发的特性 , 可更充分的利用机器上的CPU , 当开启多个协程时 , 如何保证线程的安全性 。 每个协程之间是相对独立的 , 如何在协程之间共享数据 , 进而保证数据的一致性 , 其中的一个方案是加互斥锁 。
在标准库sync包中提供了两个互斥类型:sync.Mutex 与 sync.RWMutex , 本文的代码中使用的是 sync.Mutex 类型提供的两个方法 Lock 与 Unlock 。 通过加互斥锁 , 可保证数据在多个协程间的一致性 , 增强线程安全 。
在线上生产环境中 , 每天都会产生大量的日志数据文件 , 对日志文件的过滤和分析是十分重要的 , 尤其在线上出现问题时 , 日志文件中的数据是解决问题的关键 。 这一点对支付系统来说尤为重要 。
一般来说单个日志文件的大小都很大 , 小的几G , 大的有几十G , 有的甚至更大 , 如何对单个大日志文件进行数据分析和过滤 , 如何以最快的速度进行处理 , go的高并发正适应这种场景 。 定义数据结构
创建数据结构 FilterMap , 由互斥量和映射构成 。 有一个地方需要注意 , 互斥量在第一次使用之后 , 不能被复制 。 这就决定 mutex 必须是指针类型 。
该结构有两个方法 , NewFilterMap 具有“构造函数”的功能 , 主要用来初始化;Increment 则对过滤时符合条件的内容进行计数 。 在这里使用互斥锁 , 当 fm 被锁定时 , 调用它的协程会被阻塞 , 直到它被解除锁定 。
本文插图
从命令行接收日志文件的绝对路径
使用标准库 flag 包提供的方法 , 从命令行参数中获得日志文件的绝对路径 。
本文插图
按行循环读取日志文件的数据
【『瑾说编程』怎样用管道、协程和锁实现对日志文件的过滤和统计功能?】
新建一个协程 , 专门用来将数据按行写入管道里 , 当日志文件的数据读取完毕之后 , 关闭管道 。
本文插图
创建多个协程 , 对日志数据进行过滤
用多个协程 , 同时高并发运行 , 来处理过滤数据 。
本文插图
遍历事件管道和输出统计结果
本文插图
主函数代码
本文插图
运行该程序
本文插图
推荐阅读
- 圳优信息|“副业刚需”的时代,怎样发展副业才靠谱?
- |实际评测告诉你,拥有一款华为智能眼镜是一种怎样的体验?
- 博科园|太好了,在硅光电子芯片上实现:可编程的电路、可擦除的元件!
- 上游新闻|网络数据怎样更安全?专家来渝支招
- 编程小火车|你在群里提的技术问题没人回答!是为什么?因为没注意这 4 点
- lightroom分享|怎样拍好一张好看的肖像照?
- 搜狐新闻|直降两百的小米10,骁龙865+一亿像素,你觉得怎样?
- Wind资讯|在美上市20年遭摘牌风险,一个怎样的网易回来了?
- 哈工新欧液压测试台|labview组态编程的五大经验总结,助你开发过程事半功倍
- 玩法|清晨说创业:什么是知识付费?普通人怎样通过知识付费赚钱?
