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