【瑾说编程】怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
引言
go具有高并发的特性 , 可更充分的利用机器上的CPU , 当开启多个协程时 , 如何保证线程的安全性 。 每个协程之间是相对独立的 , 如何在协程之间共享数据 , 进而保证数据的一致性 , 其中的一个方案是加互斥锁 。
在标准库sync包中提供了两个互斥类型:sync.Mutex 与 sync.RWMutex , 本文的代码中使用的是 sync.Mutex 类型提供的两个方法 Lock 与 Unlock 。 通过加互斥锁 , 可保证数据在多个协程间的一致性 , 增强线程安全 。
在线上生产环境中 , 每天都会产生大量的日志数据文件 , 对日志文件的过滤和分析是十分重要的 , 尤其在线上出现问题时 , 日志文件中的数据是解决问题的关键 。 这一点对支付系统来说尤为重要 。
一般来说单个日志文件的大小都很大 , 小的几G , 大的有几十G , 有的甚至更大 , 如何对单个大日志文件进行数据分析和过滤 , 如何以最快的速度进行处理 , go的高并发正适应这种场景 。 定义数据结构
创建数据结构 FilterMap , 由互斥量和映射构成 。 有一个地方需要注意 , 互斥量在第一次使用之后 , 不能被复制 。 这就决定 mutex 必须是指针类型 。
该结构有两个方法 , NewFilterMap 具有“构造函数”的功能 , 主要用来初始化;Increment 则对过滤时符合条件的内容进行计数 。 在这里使用互斥锁 , 当 fm 被锁定时 , 调用它的协程会被阻塞 , 直到它被解除锁定 。
本文插图
从命令行接收日志文件的绝对路径
使用标准库 flag 包提供的方法 , 从命令行参数中获得日志文件的绝对路径 。
本文插图
按行循环读取日志文件的数据
新建一个协程 , 专门用来将数据按行写入管道里 , 当日志文件的数据读取完毕之后 , 关闭管道 。
本文插图
创建多个协程 , 对日志数据进行过滤
用多个协程 , 同时高并发运行 , 来处理过滤数据 。
本文插图
遍历事件管道和输出统计结果
本文插图
主函数代码
本文插图
运行该程序
本文插图
【【瑾说编程】怎样用管道、协程和锁实现对日志文件的过滤和统计功能?】
推荐阅读
- 「空调」集中空调怎样用得安全?杭州检查5431家公共场所
- 工业互联网@程序员的术与道:术——编程基本功之网络编程
- 仨三搞笑说要怎样省油看完就知道了,车速多少最省油?不是60也不是80
- 朝阳群众母亲节互动福利|开车的时候妈妈在旁边是怎样的体验?
- 「福建省」广东江苏山东浙江福建辽宁,都有一对双星城市,济南青岛实力怎样
- 数码良品百元机怎样选不入坑?看完这几款机型你会毫不犹豫就下手
- #马化腾#当年跟马化腾一起创办腾讯,另两位大学生创始人,如今过得怎样了?
- 西芹文史是怎样于乱世中存活,撰写史书取得颇高成就,一代文学家班彪
- 于老师讲娱乐主持人和网络歌手的相遇,会有怎样的火花,甜甜的恋爱气息
- 互联网范儿5G的未来具有怎样的想象力?,全球科技巨头组局5G联盟