python简单的多线程编程_python多线程爬虫

图/文:迷神

我们在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、普通同步,单线程阻塞

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

python简单的多线程编程_python多线程爬虫

结果如下:

python简单的多线程编程_python多线程爬虫

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

2、多线程版本任务

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

python简单的多线程编程_python多线程爬虫

执行结果:

python简单的多线程编程_python多线程爬虫

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

多进程版本任务

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

python简单的多线程编程_python多线程爬虫

执行结果:

python简单的多线程编程_python多线程爬虫

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

异步版本多个任务

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

python简单的多线程编程_python多线程爬虫

执行结果:

python简单的多线程编程_python多线程爬虫

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

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

本文【python简单的多线程编程_python多线程爬虫】由作者: 乐观锁 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4147.html

(0)
上一篇 2023-03-09 08:44:02
下一篇 2023-03-09 08:51:01

相关推荐

  • 个人怎么申请微信支付接口

    1 微信公众号接口认证方案 1.1 认证流程 编辑 安全API接口认证方案 流程图模板_ProcessOn思维导图、流程图www.processon.com/view/link/636e05a21e085317c6a688d2 1)官方配置Token验证 Token不在网络中传递 2)开发一个Token验证接口 Token及其它参数拼接并字典排序再做sha摘…

    2023-03-13
    600
  • maven教程的war工程和jar工程

    一、为什么使用Maven这样的构建工具【why】 二、maven是什么【what】 三、安装maven 四、第一个maven 五、仓库和坐标 六、依赖 七、生命周期 八、Eclipse中使用maven 九、maven工程的依赖高级特性 十、build配置 图片 前言:目前所有的项目都在使用maven,可是一直没有时间去整理学习,这两天正好有时间,好好地整理一…

    2023-03-10
    600
  • 搭建web服务器

    前言: 这里以git bash 工具为例,当然你可以直接用puTTY或者Xshell链接到服务器,用FileZilla 上传文件。 一、连接服务器 ssh root@你的远程ip地址。 二、查看版本 uname -a 三、安装nginx(1) 这一步可以直接跳过,现在nginx可以直接yum install nginx安装,如果yum install ngi…

    2023-03-13
    400
  • while循环至少执行几次_while循环常见错误

    循环:有些事情可以反复执行 算法里面三大结构之循环结构。 while 循环 do…While循环 For循环 一、while循环 1、形式: while (表达式) // { //语句 } 表达式 每一次循环都要判定表达式的值 如果为真(表达式的值为1)执行循环 否则不再执行循环 为假的时候不循环(跳出循环),执行后面的代码。 执行流程:(1)第…

    实用教程 2023-03-14
    100
  • 数据库备份sql语句_sql语句在哪里写

    前言: 备份乃不死之王! 一、全表结构备份: SELECT INTO 语句:表示从一个表中选取数据,然后把数据插入另一个表中,常用来备份一张表 INSERT INTO new_table_name SELECT * FROM old_tablename;示例:备份student表,备份表取名为student_backup insert into studen…

    2023-03-11
    500
  • avx指令集对游戏的影响

    在CPU的一代一代“进化”中,除了频率、缓存乃至核心结构的变化外,有一个不太起眼的升级经常会被小伙伴们忽略,就是“扩展指令集”。指令集很多小伙伴大概耳熟,它就是指挥CPU工作的指令。不过扩展指令集又是什么?对我们使用有什么影响呢? 用一个简单的例子来说,如果说指令集是让CPU理解“9×9就是9个9连加”这种基本常识并进行计算的话,扩展指令集就可以看做是乘法口…

    2023-03-19
    000
  • 什么是软件服务的saas模式_saas业务模式

    编辑导语:疫情的出现,使企业数字化转型愈加迫切。在那之前,需要注意这一点,在当下的环境中,关于SaaS的产品都有哪些不确定性呢?本文作者会根据这个问题从三个方面来分析解读,值得一读。 在过去两年受到疫情、贸易战等多方面因素叠加影响,越来越多企业意识到数字化转型的重要性,企业上云渐渐成为中小企业在各个阶段开始尝试,甚至是起死回生的一个手段。 2021年也成为了…

    2023-03-09
    1000
  • 电脑编程学了可以干什么_学电脑编程能干什么

    很多人都知道IT行业好,IT行业收入高,知道自己需要学习,但是具体又不知道学习完毕后,自己学习的内容可以从事哪些工作内容。今天小卓就为你梳理一下学习完编程后,可以从事哪些行业,发展如何? 01互联网 最直接的工作就是到一个科技企业做程序员,人家码砖头,我们码代码。目前的互联网行业,那是需要大批的编程人员,把现实中的数据进行转换存储分析。BAT是目前国内比较好…

    2023-03-10
    900
  • osi七层模型各层的设备_osi七层模型的协议

    今天这篇文章我们带你搞懂OSI七层模型和TCP/IP基础知识,并结合OSI七层模型来介绍二、三层交换机和路由器的工作原理。 首先,一起来了解下什么是OSI七层模型? 简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。 其实互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分成七层。实际上这…

    2023-03-08
    600
  • oracle备份数据库的sql语句,oracle删除sql

    Oracle数据库使用RMAN备份,需要把数据库的非归档模式改成归档模式。 一、更改数据库的归档模式需要重新启动数据库,在mount模式下修改(三种启动模式nomount—mount— open)。 具体步骤如下: 1、进入数据库后,关闭数据库 SQL>shutdown immediate 2、启动数据库到mount状态 SQL…

    2023-03-19
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!