实现文件中名词的统计计数_怎样用管道、协程和锁实现对日志文件的过滤和统计功能?...

引言

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

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

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

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

定义数据结构

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

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

4ed719f7f3e842b53854cc188e242854.png

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

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

cedfc732429910f86904617d7f50cfb6.png

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

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

7012d16c07a91973808a4dc61c159ac0.png

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

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

7c7bcaff1d3eb54783884f0665f81eda.png

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

488a473dd8897f5d61cfd52dac858f34.png

主函数代码

72d484f9ef83efed992fb922f380487b.png

运行该程序

637f7b3836ac5de82642f00987e597eb.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值