【瑾说编程】怎样用管道、协程和锁实现对日志文件的过滤和统计功能?
引言
go具有高并发的特性 , 可更充分的利用机器上的CPU , 当开启多个协程时 , 如何保证线程的安全性 。 每个协程之间是相对独立的 , 如何在协程之间共享数据 , 进而保证数据的一致性 , 其中的一个方案是加互斥锁 。
在标准库sync包中提供了两个互斥类型:sync.Mutex 与 sync.RWMutex , 本文的代码中使用的是 sync.Mutex 类型提供的两个方法 Lock 与 Unlock 。 通过加互斥锁 , 可保证数据在多个协程间的一致性 , 增强线程安全 。
在线上生产环境中 , 每天都会产生大量的日志数据文件 , 对日志文件的过滤和分析是十分重要的 , 尤其在线上出现问题时 , 日志文件中的数据是解决问题的关键 。 这一点对支付系统来说尤为重要 。
一般来说单个日志文件的大小都很大 , 小的几G , 大的有几十G , 有的甚至更大 , 如何对单个大日志文件进行数据分析和过滤 , 如何以最快的速度进行处理 , go的高并发正适应这种场景 。 定义数据结构
创建数据结构 FilterMap , 由互斥量和映射构成 。 有一个地方需要注意 , 互斥量在第一次使用之后 , 不能被复制 。 这就决定 mutex 必须是指针类型 。
该结构有两个方法 , NewFilterMap 具有“构造函数”的功能 , 主要用来初始化;Increment 则对过滤时符合条件的内容进行计数 。 在这里使用互斥锁 , 当 fm 被锁定时 , 调用它的协程会被阻塞 , 直到它被解除锁定 。
本文插图
从命令行接收日志文件的绝对路径
使用标准库 flag 包提供的方法 , 从命令行参数中获得日志文件的绝对路径 。
本文插图
按行循环读取日志文件的数据
新建一个协程 , 专门用来将数据按行写入管道里 , 当日志文件的数据读取完毕之后 , 关闭管道 。
本文插图
创建多个协程 , 对日志数据进行过滤
用多个协程 , 同时高并发运行 , 来处理过滤数据 。
本文插图
遍历事件管道和输出统计结果
本文插图
主函数代码
本文插图
运行该程序
本文插图
【【瑾说编程】怎样用管道、协程和锁实现对日志文件的过滤和统计功能?】
- 「空调」集中空调怎样用得安全?杭州检查5431家公共场所
- 「福建省」广东江苏山东浙江福建辽宁,都有一对双星城市,济南青岛实力怎样
- 数码良品百元机怎样选不入坑?看完这几款机型你会毫不犹豫就下手
- 互联网范儿5G的未来具有怎样的想象力?,全球科技巨头组局5G联盟
- 埃尔法哥哥使用哪种编程语言的开发人员最幸福?
- 互联网范儿全球科技巨头组局5G联盟,5G的未来具有怎样的想象力?
- 强基计划:什么是“强基计划”,对高考将产生怎样影响,一文了解!
- 手机中国联盟功率器件巨头怎样去“玩转”SiC市场
- 高考作文@当年轰动一时的高考满分作文,文言文《赤兔之死》作者蒋昕捷,如今混得怎样了?
- 你的剧世界有我马云给她0.2%的股份,20年过去她怎样了?,因为美貌做阿里前台