用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很相似,以众包的方式利 ...
随机推荐
- Java线程——线程之间的死锁
一,什么是死锁? 所谓的死锁是指多个线程因为竞争资源而造成的一种僵局(相互等待),若无外力的作用,这些进程都不能向前推进. 二,死锁产生的条件? (1)互斥条件:线程要求对所分配的资源(如打印机)进行 ...
- jenkins忘记登录密码解决方法
第一步:修改配置文件 修改jenkins的配置文件,找到如下几行删除(删除前一定要备份) <useSecurity>true</useSecurity> <authori ...
- Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)
Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)
- 移除手机端a标签点击自动出现的边框和背景
手机端a标签会自动补充出现边框或者背景,使得用户知道a标签的点击状态,但样式很不好看 <!DOCTYPE html> <html> <head> <meta ...
- uni-app: 如何实现增量更新功能?
都知道,很多APP都有增量更新功能,Uni APP也是在今年初,推出了增量更新功能,今天我们就来学习一波. 当然,很多应用市场为了防止开发者不经市场审核许可,给用户提供违法内容,对增量更新大多持排斥态 ...
- WebAPI异常捕捉处理,结合log4net日志(webapi框架)
一:异常捕捉处理 首先,在我们需要区分controller的类型.是全部基层controller,还是Apicontroller.(当然一般API框架,用的都是Apicontroller).两者异常处 ...
- PAT Advanced 1020 Tree Traversals (25) [⼆叉树的遍历,后序中序转层序]
题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...
- python3拆包详解
对于可迭代对象,如元组.列表.字符串.集合.字典这些可迭代对象都可以被拆包,拆包是指将一个结构中的数据拆分为多个单独变量中.拆包的方式大致有两种,一种是以变量的方式来接收,另一种是用'*'号.下面先讲 ...
- 吴裕雄--天生自然TensorFlow高层封装:Keras-返回值
# 1. 数据预处理. import keras from keras.models import Model from keras.datasets import mnist from keras. ...
- Cell theory|Bulk RNA-seq|Cellar heterogeneity|Micromanipulation|Limiting dilution|LCM|FACS|MACS|Droplet|10X genomics|Human cell atlas|Spatially resolved transcriptomes|ST|Slide-seq|SeqFISH|MERFISH
生物信息学 Cell theory:7个要点 All known living things are made up of one or more cells. All living cells ar ...