用go写爬虫服务并发请求,限制并发数
java写爬虫服务,思路是线程池,任务队列,限制并行线程数即可。
go要用另一种设计思路,不能在线程层面限制,协程的异步请求,如果不作处理,并行发出所有网络请求,因网络请求数过多,会抛出异常
低版本的go可以并行执行map的操作,高版本会报异常,需要把map改为array,改起来很简单
func updateAllShowTimePeople() {
//得到要请求的url,多批次请求
allurls := getShowTimeTypeIndexFromDB()
//要请求的任务总数
allurlscount := len(allurls)
//每批次并行请求的数量(这里就是指同时request的数量,根据网络和机型设置)
gourp_url_count :=
//计算出一共需要执行几组,注意边界处理,例 21个url 每组5条,则要分5组(最后一组只有1条)
group_count := allurlscount / gourp_url_count
//余数
remainder := allurlscount % gourp_url_count
if remainder != {
//有余数则多算一组
group_count++ //
} else if group_count == {
//正好一组
remainder = gourp_url_count
}
//组内 任务channel array
chs := make([]chan bool, gourp_url_count)
//遍历每组 这里是串行的
for i := ; i < group_count; i++ {
//用来保存每批次的结果
pimap := make(map[int]int)
//遍历该批次内的任务,请求url
for j := ; j < gourp_url_count; j++ {
chs[j] = make(chan bool)
//不是最后一组则请求组内所有url || 是最后一组,序号小于余数的请求该url,序号大于余数的,无实际意义,直接 ch <- true。
if (i != (group_count - )) || j < remainder {
go getSingleShowTimeCurrentPeople(pimap, allurls[gourp_url_count * i + j], chs[j])
} else {
go function(){
ch <- true
}
}
}
//阻塞在这里,直到该批次内所有url都请求完毕。
for _, ch := range chs {
<-ch
}
//pimap 内保存改批次内所有url的请求结果,可以作进一步的处理,例,解析并存入数据库。
//在高级的go版本里会报并发错误,可以改用数组保存结果 getSingleShowTimeCurrentPeople(pimap, allurls[gourp_url_count * i + j], chs[j]) 中j 可用作数组索引
UpdateShowTimeSaledByShowIndex(pimap)
}
fmt.Println("all show time update finished")
}
用go写爬虫服务并发请求,限制并发数的更多相关文章
- 使用PHP文件锁写一个多个请求同时并发写入一个文件,要求不脏读、数据不丢失
使用PHP文件锁写一个多个请求同时并发写入一个文件,要求不脏读.数据不丢失. //并发文件操作 function filehandle($filename,$data){ $start = 0; $e ...
- PHP实现并发请求
后端服务开发中经常会有并发请求的需求,比如你需要获取10家供应商的带宽数据(每个都提供不同的url),然后返回一个整合后的数据,你会怎么做呢? 在PHP中,最直观的做法foreach遍历urls,并保 ...
- Oracle EBS 清除并发请求和(或)管理器数据 请求
请求说明:该请求可以清除平时提交的请求日志文件.并发管理器的日志文件.报表输出文件.并发请求和并发管理器进程的历史记录信息. 参数说明:(红色标注字段为必输项)1. 实体:ALL:清除请求历史记录. ...
- 开源个.NetCore写的 - 并发请求工具PressureTool
本篇和大家分享的是一个 并发请求工具,并发往往代表的就是压力,对于一些订单量比较多的公司这种情况很普遍,也因此出现了很多应对并发的解决方案如:分布式,队列,数据库锁等: 对于没有遇到过或者不可能线上来 ...
- PHP, Python, Node.js 哪个比较适合写爬虫?
PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...
- Web大规模高并发请求和抢购的解决方案
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...
- 开发记录_自学Python写爬虫程序爬取csdn个人博客信息
每天刷开csdn的博客,看到一整个页面,其实对我而言,我只想看看访问量有没有上涨而已... 于是萌生了一个想法: 想写一个爬虫程序把csdn博客上边的访问量和评论数都爬下来. 打算通过网络各种搜集资料 ...
- 关于web资金系统提现安全保护,防止极快的重复并发请求导致重复提现的解决思路
关于WEB金融系统中的提现安全问题很多人没有深入思想,导致有漏洞,常常会遇到有些人遇到被攻击到导资金损失的麻烦, 其实要彻底解决重复并发请求 导致重复提现问题,是需要花点心思的,并没有看起来的 ...
- 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力
1.引言 达达创立于2014年5月,业务覆盖全国37个城市,拥有130万注册众包配送员,日均配送百万单,是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利 ...
随机推荐
- Leetcode -- 两数之和Ⅰ
1. 两数之和 题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 示例:给定 nums = [2, 7, 11, 15 ...
- kaggle——贷款信用评估介绍
介绍 对于金融机构的贷款业务来说,一个顾客的信用信息是极其重要的.因为只有了解客户的信用情况,才能决定是否通过客户的贷款申请.本次将会介绍如何根据用户的一些基本信息来判断顾客的信用或贷款偿还能力. 知 ...
- poj 3013 最短路SPFA算法
POJ_3013_最短路 Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23630 ...
- Python—程序设计:观察者模式
观察者模式 内容:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.观察者模式又称“发布-订阅”模式. 角色: 抽象主题(Subject) 具体 ...
- 写一个读取Excel表格的接口
# -*- coding: gbk -*-import xlrd class Canshu: def __init__(self,filepath): """ 创建文件对 ...
- day62-html-标签
前端 blog链接:http://www.cnblogs.com/liwenzhou/p/7988087.html 1.前端都有哪些内容? HTML CSS JavaScript jQuery Boo ...
- Unity中的事件监听
Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值.如下图所示: 先以PointerClick为例.这个是用于某点点击事件.其他事件都可 ...
- Power BI 企业邮箱账户注册
Power BI 是免费的.但是一些功能需要企业账户才可以实现. 比如在线服务,移动端的服务,图标的市场,都需要注册账户实现. 1. 临时企业邮箱 百度,或谷歌一个临时邮箱.这些邮箱大多都是有使用期限 ...
- ubuntu14 编译tensorflow C++ 接口
tensorflow1.11 bazel 0.15.2 protobuf 3.6.0 eigen 3.3.5 wget -t 0 -c https://github.com/eigenteam/eig ...
- Web前端学习方向
第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 web前端开发的前景展望: 未来IT行业企业需求最多的人才 结合最新的 ...