IpProxyPool的整理
背景
- Go爬虫实践这篇文章中介绍了博主第一次使用Go写爬虫的小小实践,其中偶然用到了IpProxyPool这个Go实现的IP代理池项目,在使用中发现了一个小小的bug,在尝试查看源码解决时,突然发现这个项目是一个Go新手学习的不错的项目,非常感谢这个开源项目的作者,你的star有了!
- 这篇文章主要介绍自己是如何定位到这个开源项目的一个小bug,关于从这个开源项目中学到的知识会陆续补充到其他Go相关的文章中
bug的定位
-
bug的发现过程还是比较简单的,Go爬虫实践中使用到了此IP代理池,但是发现IP代理池运行一段时间后,请求
/all
获取随机的代理时会被阻塞掉,遂查看源码,使用最简单的打日志的方法,可将bug定位到IpModel.go:66
的代码,可以发现这是一段使用gorm框架做SQL查询的代码,既然和数据库套上关系的阻塞,其实已经大致能猜到原因了// GetAllIp 获取所有数据 func GetAllIp() []IP { db := database.GetDB() list := make([]IP, 0) err := db.Model(new(IP)).Find(&list) ipCount := len(list) if err.Error != nil { logger.Warnf("ip count: %d, error msg: %v\n", ipCount, err