io密集型和cpu密集型_一次说明白Python爬虫中多线程,多进程,异步IO编程

图/文:迷神

我们在Python爬虫中,重要的是讲究速度,如果有10万或者100万Url地址,写过爬虫的都会知道,那估计是非常慢的。我们的Python爬虫一般IO密集型业务,Python爬虫程序需要发起网络请求,必然就有网络IO阻塞,通常请求一个URL耗时要几百毫秒到几秒,逐步执行,和我们CPU那么高性能比起来,那真是天壤之别。

比如,我们Python爬虫在单线程同步爬取过程中,一个个的爬取网站所有的URL,假设100个URL,平均每个URL请求的时间是1秒,那么在单线程同步场景下,最快也需要100秒钟,才能把所有的页面爬取下来。

在网页数据爬取以后,发现在数据量不大的时候,这种普通的程序还勉强,如果想极大提高速度,做到 快速爬虫,就需要使用多线程,多进程,异步IO编程了。不过,Python中有一个臭名昭著的GIL,导致做不到真正的并行运算,多核无法真正利用起来。多线程在切换线程,还有切换成本,以及线程的创建成本。如果使用多进程,虽然能利用多核处理的优势,但是多进程的创建本城比线程更高,而IO密集型任务,CPU不是瓶颈。

鉴于此,Python3.4 还是引入了异步 asyncio 模块,增加了异步编程,跟 JavaScript 的async/await 极为类似,大大方便了异步任务的处理。异步编程使得CPU不再需要再去等待耗时的操作,而是让出CPU时间给其他任务执行,可以极大提高完成所有的任务速度。

下面,我们通过具体的小例子,来看看多线程,多进程,异步IO编程的区别:

1、普通同步,单线程阻塞

单线程版本,所有的任务,按照顺序依次等待执行。

893bffa3dac94413a9c4d3a321ff48df

单线程

结果如下:

4e880b3edc5a416aa03d18a03541f9f1

结果

可以发现,总共5个任务,他们每个任务执行时间是1秒钟,单进程阻塞时,总共耗时是5秒多一点点。

2、多线程版本任务

简单来说就是在一个进程里面,可以执行多个任务,在这里的每一个任务就是一个线程。

e80b8229276440c28ff34f13661f25d1

多线程任务

执行结果:

2a738bae0dc140499c1f9f5e8ee38c01

执行结果

换成多线程之后,5个线程各负责一个任务。我们看到执行结果:1.0039010047912598 已经明显比第一个快很多了。即使有GIL

多进程版本任务

多进程就是你的电脑允许运行多个程序,在同一段时间里面,可以 “同时” 执行多个任务。

06a7f8aaae7c4b68bb19dc5a60ce640f

多进程版本

执行结果:

5c1fc09b4ccf4536ba97f364a521392d

直接结果

执行结果:1.7484214305877686。是不是很奇怪,使用多进程,时间比多线程更慢,为什么?因为创建进程的成本是要比线程高的,虽然,它可以利用多核CPU的优势。

异步版本多个任务

最后,我们来看看异步模式下,怎么样。

a8da9ed5db14411198f9eb5f627a9ee7

异步

执行结果:

de2edc3f92fb4276a5ebe5fddfd39850

执行结果

发现使用asyncio所花的时间是最少的。asyncio可以实现单线程并发IO操作,它没有多线程和进程的创建成本,就是在单线程环境下,切换任务,当这个任务被阻塞时,立刻切换其他任务,当前面的任务完成时,在通知它,这样效率就极大的提高了。

最后,值得一说的就是一个不错的HTTP框架:aiohttp,它是一个基于asyncio实现的非常强大的HTTP框架,很值得学习哦。

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

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

相关文章

【详谈 Delta Lake 】系列技术专题 之 湖仓一体( Lakehouse )

简介: 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章。众所周知,Databricks 主导着开源大数据社区 Apache Spark、Delta Lake 以及 ML Flow 等众多热门技术,而 Delta Lake 作为数据湖核心存储引擎方案给企业带来…

移动网络安装测试软件,家宽众测中国移动手机版(在线宽带网速测试器)V2.0.3 去广告版...

家宽众测中国移动手机版(在线宽带网速测试器)是一款手机宽带网速测试工具,用户可以通过本软件加入中国移动的宽带评测活动各种,反映家中宽带的具体使用情况,支持在线报名参加,抢先体验则有奖励赠送哦,欢迎来下载。软件…

如何删除第一张单页_单页网站-网站建设中独有的风景线

在这个网页技术飞速发展的时代,单页网站由于其自身的特点已经形成了一种独有的风景线。从本质上来说,单页网站就是只有一个页面,滚动长页面来显示相关的网站内容,网站所有菜单都链接到主页相应的部位。一些前卫的客户已经开始关注…

service注入为null_如何解决quartz调度时候,job中的service为null的问题?

在需要用到调度任务的时候,发现job中的通过依赖注入的service对象为null.如下:Component public class ExpiredOrderJob implements Job {Autowiredprivate EmployeeService employeeService; //这里的service对象为nullOverridepublic void execute(Job…

工作7年,我的10条经验总结

简介: 作者是一名很普通的技术工程师,从14年毕业到现在工作了7年。本文将与大家分享一些在职场中的道理和经验,希望能对大家有所启发和帮助。 作者 | 抱真 来源 | 阿里技术公众号 前言 简单做个自我介绍,我是一名很普通的技术工…

从能用到好用,GIS信创如何做到行稳致远?

艾瑞咨询集团出品的《2021年中国信创产业研究报告》中提到,信创内涵体现在“从‘关键环节、部分市场’走向‘全产业链、全行业’的信息技术升级,构建中国自主的IT标准和生态”。本文将从GIS信创的3大关键技术战略出发,解析当下如何快速突破发…

CPU静默数据错误:存储系统数据不丢不错的设计思考

简介: 对于数据存储系统来说,保障数据不丢不错是底线,也是数据存储系统最难的部分。据统计,丢失数据中心10天的企业,93%会在1年内破产。那么如果想要做到数据不丢不错,我们可以采取怎样的措施呢&#xff1f…

分计算iv值_筛选变量的指标—IV值

这一期咱们聊聊筛选变量的指标——IV值。计算公式如下:看公式有没有很熟悉,大家没有看错,其中一部分就是WOE的计算公式。区别就在于WOE是对一个变量的每个分组的计算,IV值是对一个变量的统计指标。如上图所示,当前使用…

无需 Dockerfile 的镜像构建:BuildPack vs Dockerfile

作者 | Addo Zhang来源 | 云原生指北过去的工作中,我们使用微服务、容器化以及服务编排构建了技术平台。为了提升开发团队的研发效率,我们同时还提供了 CICD 平台,用来将代码快速的部署到 Openshift(企业级的 Kubernetes&#xff…

android studio json插件_热门Android Studio 插件,这里是Top 20

Android Studio是Google基于IntelliJ开发的一款功能强大的开发工具,它具有构建出色Android应用所需要的一切。借助基于IntelliJ IDEA的强大的功能,插件非常丰富。正确的使用插件可以帮助你提高工作效率,更智能,更快。但是&#xf…

云原生时代,企业多活容灾体系构建思路与最佳实践

简介: 对于云原生的概念解读,大家经常会听到微服务、容器这些,那么这些技术跟企业容灾到底有什么样的关系?其实容灾的需求各行各业都有,比如金融行业对于容灾也有强烈的需求。但是怎么把容灾和多活能力构建起来&#x…

MaxCompute 挑战使用SQL进行序列数据处理

简介: MaxCompute 挑战使用SQL进行序列数据处理 --而不是用MR和函数 日常编写数据加工任务,主要的方法就是使用SQL。第一是因为自己对SQL掌握的比较好(十多年数据开发经验,就这几个关键字,也不敢跟别人说自己不行&…

低代码发展专访系列之四:低代码平台会带动企业的组织变革吗?

前言:2019年开始,低代码爆火。有人认为它是第四代编程语言,有人认为它是开发模式的颠覆,也有人认为是企业管理模式的变革……有很多声音,社区讨论很热烈。CSDN随后展开低代码平台产品系列活动,包括低代码开…

esclip直接快捷键构造函数_史上最全IntelliJ IDEA mac版快捷键文档

IntelliJ IDEA 是一款功能强大的Java IDE编辑器,支持java体系的web、客户端、安卓等开发。做为一款优秀的IDE,想要提高效率,最好是记住常用的快捷键,能让你事半功倍,小编整理了IDEA所有的快捷键,让你摆脱鼠…

禁止访问 共享计算机,win7如何禁止局域网用户访问电脑

为了方便共享资源,很多人都会设置网络共享文件夹,但是有些用户觉得在局域网内共享资源是件不安全的事情,那么win7如何禁止局域网用户访问电脑?这里小编就给大家分享一下win7旗舰版32位系统设置用户禁止访问局域网的方法。win7如何禁止局域网…

基于实时深度学习的推荐系统架构设计和技术演进

简介: 整理自 5 月 29 日 阿里云开发者大会,秦江杰和刘童璇的分享,内容包括实时推荐系统的原理以及什么是实时推荐系统、整体系统的架构及如何在阿里云上面实现,以及关于深度学习的细节介绍 本文整理自 5 月 29 日阿里云开发者大会…

阿里云肖力:跳过量变过程的安全质变

简介: 作者肖力从事网络安全工作将近20年,处理过各类攻击威胁,经历了云下云上安全的建设。云计算的安全工作从10年前开始,他们搭建了阿里云平台的防护体系,帮助各行业用户在云上构建企业安全能力。云原生的出现进一步加…

echarts bar 控制大小_echarts基本配置参数

网址&#xff1a;https://www.echartsjs.com/zh/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts五分钟上手 基本配置1.矩形参数<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

opencv opencl加速_回放 | OpenCV Webinar 3:OpenCV深度学习应用与原理分析

OpenCV DNN模块提供了深度学习的推理&#xff0c;支持Caffe、Tensoflow、Torch、Darknet、ONNX等格式的模型&#xff0c;无需用户安装对应的深度学习框架&#xff0c;也无需进行模型格式转换&#xff0c;直接调用DNN模块接口即可创建深度学习应用。DNN模块自2017年8月3.3版本从…

云原生架构应该怎么设计?

简介&#xff1a; 阿里巴巴为大量各行各业的企业客户提供了基于阿里云服务的解决方案和最佳实践&#xff0c;以帮助企业完成数字化转型&#xff0c;并积累了大量经验和教训。阿里巴巴将企业的核心关注点、企业组织与 IT 文化、工程实施能力等多个方面与架构技术相结合&#xff…