爬虫协程比线程爬取速度更快?
先做个小示例,不用废话谈理论,没有实践的空谈都是扯蛋误导人。
这篇文章不讨论线程 协程的理论。只讨论标题的主题问题,爬虫速度。
# coding=utf-8 import requests,time count=0 urlx= 'http://www.xxsy.net/' # 'http://www.danmeila.com/' http://www.sina.com.cn/ 'http://www.qingkan9.com/' # # 'http://www.qingkan9.com/' def fun(url):try:print urlresp=requests.get(url)if resp.status_code!=200:print '***',resp.status_codeglobal countcount+=1print count,' ',round((time.time()-start_time),3)except Exception as e:passdef single_fun():for i in range(1000000):fun(urlx)def gevent_fun():from gevent import monkeymonkey.patch_all(socket=True,select=True)from gevent.pool import Poolgevent_pool = Pool(800)urls = [urlx for i in range(1000000)]gevent_pool.map(fun, urls)def thread_fun():import threadpoolthread_pool = threadpool.ThreadPool(200)requestsx = threadpool.makeRequests(fun, [urlx for i in range(1000000)])[thread_pool.putRequest(req) for req in requestsx]thread_pool.wait()def funx(a,b=None):print a,bif __name__=="__main__":start_time=time.time()#single_fun() ##用什么就把其他的注释掉,三种模式#gevent_fun()thread_fun()
View Code
此图为顺序执行。
此图为协程,800并发。
此图为200线程。
上面的是以请求潇湘书院首页为例。
可以看到单个请求的同步执行,在120秒内的请求数量远少于后两者,不管运行多少次,都是这样的明显少于后两者。
协程和线程相比,120秒内请求的数量非常接近,受网速的小幅波动影响可能每次运行结果都会差点(运行程序时候把其他所有连接网络的软件关闭掉,减小干扰),但不管如何,两者都是非常接近的。
协程可以开启更多,但线程开大概500以上后就会出错,包括web性能测试工具jmter loadrunner这些工具也都是单机并发有限的,并发设置多了一样会报错。我这里开多线程用200,协程用800,尽管协程能开更多,但网速早就跑满了。
线程和协程都能使网速一直跑满。在网速一直持续饱满的情况下,那么一定时间内,能够请求的字节总数都是一样的,所以这和多线程和协程在120秒内的请求个数非常接近,基本是一致的。
潇湘书院根本不需要开800协程,100协程早就能足够跑满网速了。
还有人说开协程可以开100万,线程开不了那么多,所以协程有优势,这完全是扯鸡巴蛋,我可以直接判断他从没有开过100万协程 requets,不服的可以把800改成1000000看看效果,我也基本可以95%断定他连1万协程requests都没有试过。没人遇到cant watch more than 1024 sockets了吗。只要不是响应时间差的离谱的网站,100协程早就足够了。再加更多也不能让120秒内请求更多的页面。
速度乘以时间等于路程。
网络使用速度*时间=总字节数。
两个变量相同的情况下得到的乘积肯定是一样的。这种常识不需要再理论了。
说协程比线程爬取速度更快那么就是扯蛋了,不要看了一点理论,就自以为掌握了精髓,对事情妄下结论。
至于在一次面试中,一个创业小公司的面试官说他看网上是python多线程是假的,他爬虫只用多进程从不用线程,这跟是无语了,为什么只是看别人说,自己不去试下。不知道那面试官是看了网上正确的东西的但他看一半理解的断章取义了,还是他看了网上错误的东西。全指望多进程是不好的,多进程占用内存巨大,启动多进程需要的时间特别漫长,多进程能不能使网速使用率更高,满速了就不能再突破。
上面的实验使用潇湘书院做的,测试过程中还是用了一个很小的网站,但那个网站是很小的,响应速度超级慢,不管开了多少线程 协程都只能达到100多kb,可能人家的服务器下行带宽就那样。
测试过程中还是用了新浪网首页,请求新浪网的情况下,新浪网作为首屈一指的大网站,响应速度是非常非常好,同时一个页面的字节数非常大,所以使用单个请求同步执行和协程 线程相比,虽然差了一点,但是远没有潇湘书院那么夸张差了10倍。也就是响应时间越大的网站,gevent threding比单线程优势才能更明显。
搞东西,不要光理论就想当然的认为怎么样了,即使是喜欢看理论的人,也需要实践。三国时期的蜀国马谡是怎么死的,战国时期的赵国马服子是怎么死的,熟读兵书说起理论一套一套的,仅从一些理论就过于的认为一件事怎么样,太想当然了。 马谡 和马服子既可怜又可恨,可怜是他们都不算大坏人,但结局都是死的非常惨,可恨是他们只喜欢纸上谈兵说起东西来一套一套的的,不注重实践,最终不仅是害了自己,还连累三军,马谡和马服子直接加速了蜀国和赵国的灭国之灾。 如果当时不派这两个人去带兵打仗,随便派个垃圾小兵做主将都不会出现输得这么惨。
转载于:https://www.cnblogs.com/ydf0509/p/7223160.html
爬虫协程比线程爬取速度更快?相关推荐
- 使用单线程,多线程,协程,异步爬取包图网大国工匠视频
使用单线程爬取,多线程,协程爬取,异步爬取包图网视频 文章目录 使用单线程爬取,多线程,协程爬取,异步爬取包图网视频 第一步使用单线程爬取包图网视频 多线程爬取视频 用协程爬取 基于协程的异步爬取 第 ...
- python从网址爬图片协程_python协程gevent案例 爬取斗鱼图片过程解析
分析 分析网站寻找需要的网址 用谷歌浏览器摁F12打开开发者工具,然后打开斗鱼颜值分类的页面,如图: 在里面的请求中,最后发现它是以ajax加载的数据,数据格式为json,如图: 圈住的部分是我们需要 ...
- python协程gevent案例 爬取斗鱼图片过程解析 - python
文章来源: 敏而好学论坛 嗨学网www.piaodoo.com 欢迎大家相互学习 分析 分析网站寻找需要的网址 用谷歌浏览器摁F12打开开发者工具,然后打开斗鱼颜值分类的页面,如图: 在里面的请求中, ...
- Python3 协程 + 正则 批量爬取斗鱼美女图片
from urllib import request from gevent import monkey import random import re import geventmonkey.pat ...
- 以爬虫为例,单线程,协程,线程,进程之间性能的比较,原来协程可以这么快?
前言 因为刚刚学习到了协程,然后之前也对爬虫有一定的了解,所以打算结合之前学的线程和进程,和协程进行对比,看看它的性能到底有多高,在测试完成后,结果还是不错的!下面就直接上代码了,因为代码逻辑都比较简 ...
- Python爬虫开源项目代码(爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网 等等)...
文章目录 1.简介 2.开源项目Github 2.1.WechatSogou [1]– 微信公众号爬虫 2.2.DouBanSpider [2]– 豆瓣读书爬虫 2.3.zhihu_spider [3 ...
- 爬虫学习(一)---爬取电影天堂下载链接
欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 主要利用了python3.5 requests,Bea ...
- python3爬虫系列16之多线程爬取汽车之家批量下载图片
python3爬虫系列16之多线程爬取汽车之家批量下载图片 1.前言 上一篇呢,python3爬虫系列14之爬虫增速多线程,线程池,队列的用法(通俗易懂),主要介绍了线程,多线程,和两个线程池的使用. ...
- 携程酒店数据爬取2020.5
携程酒店数据爬取2020.5 1. 开题 目前网上有好多爬取携程网站的教程,大多数通过xpath,beautifulsoup,正则来解析网页的源代码.然后我这个菜b贪方便,直接copy源码的xpath ...
- Python爬虫开源项目代码(爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网 等等)
文章目录 1.简介 2.开源项目Github 2.1.WechatSogou [1]– 微信公众号爬虫 2.2.DouBanSpider [2]– 豆瓣读书爬虫 2.3.zhihu_spider [3 ...
最新文章
- 飞书×品玩邀请多位行业大咖,共谈跨境企业“战疫”秘籍!
- equals方法重写详解
- 【pytorch】pytorch自定义训练vgg16和测试数据集 微调resnet18全连接层
- (原创)让mongodb的secondary支持读操作
- python3 新式类_python新式类和旧式类区别
- C++设计模式-AbstractFactory抽象工厂模式
- POJ - 2485(最小生成树.prime)
- C#正则表达式——网游角色起名仅允许汉字、字母、数字、底划线
- FirstApp,iphone开发学习总结3,UIButton简单的操作
- 微型计算机中的存储容量1TB等于,自考计算机应用基础_通关宝典
- network location awareness 错误
- Snipaste下载以及一部分使用的快捷方式
- 按键精灵 excel mysql_按键精灵常用插件介绍
- Mongodb索引及explain
- 文献阅读(44)—— 基于眼底照的近视深度学习算法和区块链平台,以促进人工智能医学研究:回顾性多队列研究
- Unity3D 绑定机械传动 插件包
- 【Win10 UWP】微信SDK基本使用方法和基本原理
- 书评与摘抄《如何阅读一本书》
- 彩色PCB 彩色丝印 2023年了PCB都是五彩斑斓了
- docker创建容器相关命令【详细版】
热门文章
- 多线程编程之二——MFC中的多线程开发(收藏)
- LOG. Supervisor基本使用
- 微服务学习之Consul服务注册与发现【Hoxton.SR1版】
- 微服务学习之02支付模块构建(单个、集群)【Hoxton.SR1版】
- 小米路由器刷梅林教程_小米路由器3刷X-Wrt固件教程
- 在mysql中字符串的操作_mysql中的字符串操作.doc
- 合沟微服务怎么添加_如何在微服务中使用webservice?
- 大学使用python 编辑器_Python数据分析|最多人用的代码编辑器推荐
- python deepcopy函数_Python对象引用与可变性
- android httpclient webview,android – 访问WebView中的http响应头?