go 爬虫速度控制

news2024/12/23 23:08:09

go 爬虫速度控制

  • 使用go语言用原生net/http写爬虫如何优雅的控制并发和请求速度
    • 控制并发
    • 限流
    • 并发和限流的区别
      • 简单说明
      • 有了并发控制为什么还要限流
    • 最总代码

使用go语言用原生net/http写爬虫如何优雅的控制并发和请求速度

go程序的执行效率相对python要快的多,且占用的内存和cpu更少
本教程实现控制爬虫程序并发上限,同时控制程序对外请求上限。

如果只是控制并发程序对外请求速度并不稳定,所以我们需要同时控制请求速度

控制并发

var maxTaskLen = make(chan bool, 1000) // 通过管道控制并发数量,最大100个并发
var wg = sync.WaitGroup{}             // 计数器,记录正在执行的任务数量
func main()  {
	for i:=0;i<= 100;i++{
		// 提交异步任务
		maxTaskLen <- true // 当管道满了。会在这里阻塞
		wg.Add(1)          // 计数器加一
		// 开启协程
		go func(goodsId string, mongoObjectId string) {
			defer func() {
				<-maxTaskLen // 从管道取出一个
				wg.Done()    // 并发计数器减一
			}()
			TB(goodsId, mongoObjectId)  // 爬虫函数
		}(result.GoodsId, result.Id)
	}
	wg.Wait() // 等待计数器归零(所有任务执行完毕)再结束主进程
}

限流

var rateLimit = rate.NewLimiter(500, 20)	// 限流
func main()  {
	for i:=0;i<= 100;i++{
		// 限流
		for {
			if rateLimit.Allow() {  // 桶满了阻塞在这里
				break
			}
		}
		// 开启协程
		go func(goodsId string, mongoObjectId string) {
			TB(goodsId, mongoObjectId)  // 爬虫函数
		}(result.GoodsId, result.Id)
	}
}

并发和限流的区别

简单说明

可以将整个采集流程看成一段河流,将数据当作水。
并发就相当于河道的宽度,河道越宽单位时间内流过的水就越多。
而限流就相当于桥洞,河流要经过桥洞,桥洞的大小决定了瞬间有多少水流过河流

有了并发控制为什么还要限流

采集过程中需要使用代理,代理是有并发和带宽的上限的,代理的上限就是限流的大小,限流只控制爬虫调用代理的速度,踩着代理的上限跑爬虫

代理的并发表现

最总代码

var maxTaskLen = make(chan bool, 1000) // 通过管道控制并发数量,最大100个并发
var wg = sync.WaitGroup{}             // 计数器,记录正在执行的任务数量
var rateLimit = rate.NewLimiter(500, 20)	// 限流
func main()  {
	for i:=0;i<= 100;i++{

		// 限流
		for {
			if rateLimit.Allow() {  // 桶满了阻塞在这里
				break
			}
		}
		
		// 提交异步任务
		maxTaskLen <- true // 当管道满了。会在这里阻塞
		wg.Add(1)          // 计数器加一
		// 开启协程
		go func(goodsId string, mongoObjectId string) {
			defer func() {
				<-maxTaskLen // 从管道取出一个
				wg.Done()    // 并发计数器减一
			}()
			TB(goodsId, mongoObjectId)  // 爬虫函数
		}(result.GoodsId, result.Id)
	}
	wg.Wait() // 等待计数器归零(所有任务执行完毕)再结束主进程
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在半年内找到理想的数据库内核开发工作?

学习和提升技能&#xff1a;着重学习数据库原理、数据结构、算法和数据库内核开发相关的知识。掌握SQL语言和数据库设计&#xff0c;了解常见的数据库系统和底层技术。参加培训、在线课程或自学&#xff0c;不断提升自己的技术能力。 我这里刚好有嵌入式、单片机、plc的资料需…

三、CAS认证流程

一、相关概念 TGC(Ticket-granting cookie)&#xff1a;存放用户身份认证的cookie&#xff0c;在浏览器和CAS server用来明确用户身份的凭证&#xff1b;ST(Service Ticket)&#xff1a;CAS服务器通过浏览器分发给客户端服务器的票据&#xff0c;一个特定服务只能有一个唯一的…

微信小程序开发学习之页面导航(声明式导航和编程式导航)

微信小程序之页面导航&#xff08;声明式导航和编程式导航&#xff09; 1.0 页面导航1.1. 声明式导航1.1.1. 导航到tabBar页面1.1.2. 导航到非tabBar页面1.1.3. 后退导航 1.2. 编程式导航1.2.1. 导航到tabBar页面1.2.2. 导航到非tabBar页面1.2.3. 后退导航 1.3. 导航传参1.3.1.…

手把手教你用 NebulaGraph AI 全家桶跑图算法

前段时间 NebulaGraph 3.5.0 发布&#xff0c;whitewum 吴老师建议我把前段时间 NebulaGraph 社区里开启的新项目 ng_ai 公开给大家。 所以&#xff0c;就有了这个系列文章&#xff0c;本文是该系列的开篇之作。 ng_ai 是什么 ng_ai 的全名是&#xff1a;Nebulagraph AI Sui…

安装RabbitMQ 详细步骤

我这里是在Linux系统里面安装的按照步骤即可 1. 安装Socat&#x1f349; 在线安装依赖环境&#xff1a; yum install gcc yum install socat yum install openssl yum install openssl-devel2. 安装Erlang&#x1f349; 去官网下载一下安装包&#xff0c;将安装包拉到Linux系…

苹果APP安装包ipa如何安装在手机上

苹果APP的安装比安卓复杂且困难&#xff0c;很多人不知道如何将ipa文件安装到手机上。以下是几种苹果APP安装在iOS设备的方式&#xff0c;供大家参考。 一、上架App Store 这是最正规的方式。虽然审核过程复杂、时间较长&#xff0c;且审核条件较为苛刻&#xff0c;但借助第三…

【UE C++】蓝图调用C++函数

目录 一、蓝图调用其继承的C类的函数 二、蓝图调用全局C函数 一、蓝图调用其继承的C类的函数 首先新建一个C类 父类选择“Actor” 这里命名为“MyActorFromC”&#xff0c;然后点击创建类&#xff0c;等待编译完成。 在头文件中申明函数 UFUNCTION(BlueprintCallable, Categ…

list分段截取方法

对list 分段截取方法是一个常见的操作&#xff0c;通常用于对list数据批量操作&#xff0c;常见的场景有返回分页展示数据&#xff0c;对大数据进行分批次插入数据库等 package com.hmdp.dto;import org.apache.commons.collections4.ListUtils; import org.springframework.u…

Golang学习——string和slice切片

Golang学习——string和slice切片 string整数存储字符存储Unicode存储变长编码规则字符串类型变量的结构字符串变量的修改方式 slice通过make的方式定义变量new底层数组slice扩容规则1.预估扩容后的容量newCap2.newCap个元素需多大内存3.匹配到合适的内存规格练习 string 整数…

如何进行高效的日程管理?

在日程安排逐渐增多的现代职场中&#xff0c;如果想要高效完成工作事项&#xff0c;就必须做好每天的日常管理。但是有不少上班族表示自己在做日程管理时往往感到力不从心&#xff0c;很难做到真正有效的管理自己的日程安排&#xff0c;那么问如何进行高效的日程管理呢&#xf…

利用Python数据挖掘技术深入理解股票回撤的本质

股票回撤是投资者关注的一个重要指标&#xff0c;也是进行风险评估和投资决策的必要依据。通过利用Python数据挖掘技术深入理解股票回撤的本质&#xff0c;可以更加准确地评估风险和制定投资策略。 一、什么是股票回撤 股票回撤是指股票价格在上涨过程中出现暂时的下跌&#…

2023开放式蓝牙耳机推荐,开放式耳机如何选购?十五款开放式耳机一文看到底!

最近发现网上很多小伙伴在挑选开放式蓝牙耳机&#xff0c;也看到很多开放式耳机的评测文章&#xff0c;五花八门&#xff0c;各式各样&#xff0c;导致很多小伙伴想挑选一款好用的开放式耳机&#xff0c;却又怕踩雷&#xff01; 那么问题来了&#xff01;怎样选择一款合适的开…

代码随想录二刷 day48 |动态规划之 198打家劫舍 213打家劫舍II 337打家劫舍III

day48 198.打家劫舍1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 213.打家劫舍II情况一&#xff1a;考虑不包含首尾元素情况二&#xff1a;考虑包含首元素&#xff0c;不包含尾元素情况三&…

在培训班里学技术,真的有用吗?

在培训班里学技术&#xff0c;真的有用吗&#xff1f; &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

打印机从0到入门

一.连接 1.USB连接方式 2.网络打印服务器连接方式 使用打印服务器可以将不能联网的打印机设置为同一网段下的主机均可使用&#xff0c;有的打印服务器也可跨网段连接。 二.共享 不同终端处于同个网络下&#xff0c;主机网络通信通过WIFI连接&#xff08;打印机连接的主机通…

2023最新 Navicat 16.2.3 安装和试用教程详解

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

四个按键控制led的四种变化(按键控制led)(附源码)

文章目录 一、实验任务二、系统框图三、代码实现四、引脚分配五、总结 一、实验任务 使用开发板上的四个按键控制四个LED灯。按下不同的按键时&#xff0c;四个LED灯显示不同效果。本实验是在EP4CE6F17C8开发板上实现&#xff0c;仿真请用modelsim Altera 二、系统框图 三、代…

23 分页控件

文章目录 界面设置初始化主对话框子页面初始化 页面1枚举窗口页面2枚举进程全部代码 界面设置 ui 设置 >创建CTablCtrl > 创建页控件&#xff08;子窗口&#xff09;&#xff0c;style设置成为chlid 添加类 页面中加入listCtrl 控件 添加变量 分别添加初始化函数 初始化…

3ds Max 建模基础教程:创建棕榈植物

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 嘿伙计们&#xff0c;在本教程中&#xff0c;我们将学习如何使用其花盆创建棕榈植物&#xff0c;首先我们将对花盆进行建模&#xff0c;然后设置叶子和纹理&#xff0c;我从谷歌搜索中找到了纹理&#xff0…

常用的k8s管理命令

Kubernetes 是一个由主节点和工作节点组成的容器编排工具。它只允许通过作为控制平面核心组件的 API 服务器进行通信。API 服务器公开了一个 HTTP REST API&#xff0c;允许内部组件&#xff08;如用户和集群&#xff09;和外部组件之间的通信。 你可以将 API 服务器视为 Kuber…