您的位置 首页 > 体育运动

【fm球员职员过滤】怎样用管道、协程和锁实现对日志文件的过滤和统计功能?

引言

  go具有高并发的特性,可更充分的利用机器上的CPU,当开启多个协程时,如何保证线程的安全性。每个协程之间是相对独立的,如何在协程之间共享数据,进而保证数据的一致性,其中的一个方案是加互斥锁。

  在标准库sync包中提供了两个互斥类型: 与 ,本文的代码中使用的是 类型提供的两个方法 Lock 与 Unlock。通过加互斥锁,可保证数据在多个协程间的一致性,增强线程安全。

  在线上生产环境中,每天都会产生大量的日志数据文件,对日志文件的过滤和分析是十分重要的,尤其在线上出现问题时,日志文件中的数据是解决问题的关键。这一点对支付系统来说尤为重要。

  一般来说单个日志文件的大小都很大,小的几G,大的有几十G,有的甚至更大,如何对单个大日志文件进行数据分析和过滤,如何以最快的速度进行处理,go的高并发正适应这种场景。

定义数据结构

  创建数据结构 FilterMap,由互斥量和映射构成。有一个地方需要注意,互斥量在第一次使用之后,不能被复制。这就决定 mutex 必须是指针类型。

  该结构有两个方法,NewFilterMap 具有“构造函数”的功能,主要用来初始化;Increment 则对过滤时符合条件的内容进行计数。在这里使用互斥锁,当 fm 被锁定时,调用它的协程会被阻塞,直到它被解除锁定。

从命令行接收日志文件的绝对路径

  使用标准库 flag 包提供的方法,从命令行参数中获得日志文件的绝对路径。

按行循环读取日志文件的数据

  新建一个协程,专门用来将数据按行写入管道里,当日志文件的数据读取完毕之后,关闭管道。

创建多个协程,对日志数据进行过滤

  用多个协程,同时高并发运行,来处理过滤数据。

遍历事件管道和输出统计结果

主函数代码

运行该程序

关于作者: luda

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐