python 串行线程终止后还会执行下一个吗_提高爬虫效率——多线程

本文介绍了如何通过Python的多线程技术提高爬虫的运行效率。作者指出,由于Python的GIL(全局解释器锁)限制,Python的多线程并不能实现真正的并行,但可以实现并发,尤其适用于IO密集型任务如爬虫。通过一个多线程爬取虎扑火箭专区100页标题的例子,原本39秒的爬取时间缩短到了3.7秒,效果显著。下一期将讨论更强大的爬虫工具——协程。
摘要由CSDN通过智能技术生成

3d8f9a5107ebc7e60915e0961ebc299b.png

在之前的推送中,我们已经对虎扑火箭专区100页标题进行了爬虫,用时30多秒,这一篇我们的目的是提高爬虫效率,缩短用时。

什么是多线程?

太过理论的东西我不想讲,因为我这个公众号定位是实用主义,希望大家看了能迅速学习,直接在自己的代码里派上用场,所以看不下去理论部分的可以直接看代码。

我们之前的类似这种遍历,属于一个一个按顺序来爬

for i in range(10):
   crawl(i)

相当于一个人煮开水,把水壶放上底座之后,就在旁边站着等,等水烧开了,再拿另一壶水来烧,这就是单线程。由于Python默认的解释器有GIL,Python的多线程是假的多线程,不是货真价实的。

什么是GIL?

GIL(Global Interpreter Lock)即全局锁,它规定一个解释器在同一时间只能运行一个线程。

Python的线程需要取得GIL才能运行,释放了GIL被其他线程拿去,其他线程才能开始运行,所以Python的多线程不能做到并行(同时运行多个线程)

04528c64ab1efd46431c4fdaef97a991.png

但是能做到并发(同一间隔运行多个线程)

634fcf14f3e5fd87bd43940de4f296ef.png

用我上面煮开水的例子来说明的话,就是Python的多线程不能让10个人同时煮一壶开水,但是可以让1个人把水壶放到底座上之后(释放GIL),不等它烧开就拿另一壶水放到l另一个底座上,这样就相当于节省了干等的时间。

所以这对IO密集型(读写文件,网络请求)的代码很有意义,对于爬虫来说,它可以让我们不必等到网络响应,就可以开始下一个网络请求。

终于到代码部分了

Python的多线程代码实现非常简单

用之前的代码单线程爬取100页的标题需要39秒,这次用多线程需要多少秒呢?

cc84e7c2396ba6dd0a062ea82e3b5b9c.png

函数部分不做更改

from threading import Thread
#函数部分上一篇有,这里就略过了
def get_title(n):
   pass

threads = []
for i in range(100):
   #实例化线程对象,target是函数名,args是函数的参数,以元组形式表示
   t = Thread(target=get_title,args=(i,))
   #线程启动
   t.start()
   threads.append(t)
for i in threads:
   #等待线程中止
   i.join()

还有一种写法是继承Thread类,稍微复杂一点,文章定位新手向,所以就不细说了

最后一步join()是等待线程终止后再继续,不然有可能上面进程刚开启,还没跑完,下面就运行了,不过在这个代码里,下面就没内容了,所以不加也可以。

猜一下用时多少?

3.7秒!仅仅是之前的1/10!

2c05113c0a761afff0a3ebeba0c1f6df.png

立竿见影!

下次会讲比多线程更强大的爬虫武器——协程,敬请期待

cf689ce2623afa6af682c2f8a9bb60e6.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值