Python网络开发必备:gevent协程库的性能优势与特点详解

那些使用Python作为网络开发的人可能听说过Gevent图书馆。 GEVENT是第三方Python Corchuristic图书馆。让Gevent的性能良好,比Greenlet更好。根据Gevent的官方信息(url :),Gevent具有以下特征:

Python网络开发必备:gevent协程库的性能优势与特点详解

基于libev或libuv的快速事件周期。

基于Greenlet的轻巧执行单元。

在Python标准库中重复该概念的API(例如,事件和队列)。

SSL支持的协作插座

DNS查询由线程池,DNSpython或C-Ares执行执行。

猴子维修实用程序,以便第三方模块可以合作

TCP / UDP / HTTP服务器

基质支持(通过gevent.subprocess)

线程池

作者总结说,Gevent的一般原则是绿色遇到需要等待的操作(主要是IO操作),例如网络IO/睡眠等待。此时,在适当的情况下切换回去继续执行。在此过程中,仍然只执行了一个线程,但是由于我们正在等待某些IO操作,因此我们切换到其他操作以避免等待无用的等待,这大大节省了我们的时间并提高了效率。

在观看了这么多优势之后,我觉得有必要尝试尝试它,但是起初效果非常不满意,速度并不高。后来,在仔细研究了Gevent的使用后,我发现Gevent的高效率是Gevent的效率很高。条件,重要条件之一是使用猴子补丁,这是我们经常称呼的猴子补丁。

猴子补丁是在不更改源代码的情况下更改和优化程序,该源代码主要适用于动态语言。通过Monkey Patch,Gevent取代了标准库中的大多数阻塞系统调用,例如插座,SSL,螺纹和选择等,并变成了协作操作。在下面,我仍然使用代码显示猴子补丁的使用和使用。该程序显示该程序是一个带有少量代码的小型爬行动物程序,这很方便阅读和运行。同时,它还可以更好地测试猴子补丁的改进程度。主要的想法是在今年第二季度从票房Mojo网站上捕获北美电影市场发行的电影,然后从每部电影的信息页面中提取每部电影的分类,然后保存名称每部电影及其相应成绩。在词典中,测试整个过程的时间。在这里,我们主要测试在三种情况下完成该程序的时间。它们通常是不使用gevent的爬行动物,使用gevent但不使用猴子补丁爬行动物,而使用gevent和monkey patch则使用了爬行动物。

首先查看不使用Gevent的正常爬行动物。

首先导入所需的库。

import time
import requests
from lxml import etree

然后在第二季度阅读电影的页面。

url = r'https://www.boxofficemojo.com/quarter/q2/2020/?grossesOption=totalGrosses' #第二季度上映电影的网址
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'} #爬虫头部
rsp = requests.get(url, headers=headers) #读取网页
text = rsp.text #获取网页源码
html = etree.HTML(text)
movie_relative_urls =  html.xpath(r'//td[@class="a-text-left mojo-field-type-release mojo-cell-wide"]/a/@href') #获取每部电影的信息页面的相对地址
movie_urls = [r'https://www.boxofficemojo.com'+u for u in movie_relative_urls] #把每部电影的相对地址换成绝对地址
genres_dict = {} #用于保存信息的字典

上述代码中的可变URL是第二季度发行的电影的网址。页面的屏幕截图如图1所示。标题是爬行动物仿真浏览器的头部信息。每个电影的信息页面是图1中每个电影名称的名称中包含的URL。单击每个电影名称以输入其相应的页面。由于此URL是一个相对地址,因此必须将其转换为绝对地址。

图1。第二季度发行的电影页面

下一步是阅读每个电影的信息页面。

def spider(url): #这个函数主要用于读取每部电影页面中的电影分级信息
    rsp = requests.get(url, headers=headers) #读取每部电影的网页
    text = rsp.text #获取页面代码
    html = etree.HTML(text)
    genre = html.xpath(r'//div/span[text()="Genres"]/following-sibling::span[1]/text()')[0] #读取电影分级信息
    title = html.xpath(r'//div/h1/text()')[0] #读取电影名称
genres_dict[title] = genre #把每部电影的名称和分级信息存入字典

此功能是阅读每个电影信息页面的信息。它的功能类似于读取上面的URL页面的功能。这很简单。没什么可说的。在每个电影页面中,我们要阅读的每个电影的层次信息都是流派行。例如,图2中的Wrtchch及其流派信息令人恐惧。

图2。示例电影信息页面

下次是时间计算。

normal_start = time.time() #程序开始时间
for u in movie_urls:
    spider(u)
normal_end = time.time() #程序结束时间
normal_elapse = normal_end - normal_start #程序运行时间
print('The normal procedure costs %s seconds' % normal_elapse)

我们使用time.time()方法计算时间来减去开始时间的结束时间是程序运行时间。在这里,我们主要测试蜘蛛功能多次运行的时间。结果表明该过程花费了59.6188秒。

第二个爬网是使用gevent,但不使用猴子补丁。它的完整代码如下。

import time
from lxml import etree
import gevent
import requests
url = r'https://www.boxofficemojo.com/quarter/q2/2020/?grossesOption=totalGrosses'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
rsp = requests.get(url, headers=headers)
text = rsp.text
html = etree.HTML(text)
movie_relative_urls =  html.xpath(r'//td[@class="a-text-left mojo-field-type-release mojo-cell-wide"]/a/@href')
movie_urls = [r'https://www.boxofficemojo.com'+u for u in movie_relative_urls]
genres_dict = {}
task_list = [] #用于存放协程的列表
def spider(url):
    rsp = requests.get(url, headers=headers)
    text = rsp.text
    html = etree.HTML(text)
    genre = html.xpath(r'//div/span[text()="Genres"]/following-sibling::span[1]/text()')[0]
    title = html.xpath(r'//div/h1/text()')[0]
    genres_dict[title] = genre
    
    
gevent_start = time.time()
for u in movie_urls:
    task = gevent.spawn(spider, u) #生成协程
    task_list.append(task) #把协程放入这个列表
    
gevent.joinall(task_list) #运行所有协程
gevent_end = time.time()
gevent_elapse = gevent_end - gevent_start
print('The gevent spider costs %s seconds' % gevent_elapse)

这里的大多数代码与以前的搜寻器代码相同,但是还有一个额外的task_list变量,这是存储公司的列表。我们从gevent_start = time.time()开始。同一个爬行者。 task = gevent.spawn(spider,u)是一种生成gevent生成的coroutine的方法。 task_list.append(task)将每个coroutine放入此列表中,而gevent.joinall(task_list)正在运行所有coroutines。本质上述过程与我们的多线程方式非常相似。结果为59.1744秒。

最后一个爬行者是同时使用Gevent和Monkey补丁的爬行动物。在这里,我不再粘贴代码,因为代码几乎与第二个爬网相同。只有一个区别,也就是说,Geoport Monkey有一系列额外的代码。 monkey.patch_all()请注意,这是一行代码,但其中包含两个语句,这些语句与半元编号组合在一起。最重要的是,应将这条代码线放在所有代码的前面,请记住!交点交叉点

该爬网的结果为26.9184秒。

我将三个爬行动物分别放在三个文件中,分别为normal_spider.py,gevent_spider_no.py和gevent_spider.py。 y补丁爬行动物。这里要注意的一件事是,猴子补丁不支持Jupyter笔记本电脑,因此必须在命令行中使用这三个程序,并且在笔记本电脑中不能使用。

最后,下面总结了三个爬行动物的结果。

图3。三个爬行动物的结果比较

可以看出,使用gevent而非猴子贴片的爬行动物和普通爬行者的运行时间几乎完全相等。使用Monkey补丁后,运行时间仅占以前程序的一半,速度增加了约120%。它带来了如此大的速度提高,并且猴子补丁的作用仍然很大。前两个爬网的速度几乎相同。作者认为,原因是这两个程序正在以一个线程为单位,这本质上没有太大不同。同时,GEVENT的效果。

从这个示例可以看出,猴子补丁具有很大的改进,但是Gevent目前仅对普通库,尤其是官方标准库有补丁效果。其他第三方库的效果尚不清楚。因此,根据情况确定。本文的代码在Gitee代码网站上。 URL是,如有必要,您可以自己下载它。

关于作者:Mort,数据分析爱好者,擅长数据可视化,更多地关注机器学习领域,希望与行业中的朋友一起学习更多。

值得赞赏的作者

作为一个分散的全球技术界,Python中国社区已成为全球200,000名中国开发商的精神部落的愿景。目前,它涵盖了主要的主流媒体和协作平台,与Ali,Tencent,Baidu,Amazon,Amazon,开源,开源,开源,开源中国,CSDN以及其他知名的公司和技术社区建立了广泛的联系。他们有成千上万的注册成员来自十多个国家和地区。成员来自Tsinghua大学,北京大学,北京大学邮政与电信大学,中国人民银行以及中国科学院政府机构,科学研究部,金融机构以及众所周知的中国科学院政府机构,著名涉及整个平台上有近200,000名开发人员的国内外公司,由中国,华为,蝙蝠,Google,Microsoft等代表。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

34阅读

外国教程python,python编程教学视频

2026年09月02日

28阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

22阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

28阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

23阅读