请求网页

方法一:

import asyncio
import requestsasync def main():loop = asyncio.get_event_loop()future1 = loop.run_in_executor(None, requests.get, 'http://www.baidu.com')future2 = loop.run_in_executor(None, requests.get, 'http://www.python.org')response1 = await future1response2 = await future2print(response1.text)print(response2.text)loop = asyncio.get_event_loop()
loop.run_until_complete(main())

方法二:

copy from liaoxuefeng
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432090954004980bd351f2cd4cc18c9e6c06d855c498000

import asyncio@asyncio.coroutine
def wget(host):print('wget %s...' % host)connect = asyncio.open_connection(host, 80)reader, writer = yield from connectheader = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % hostwriter.write(header.encode('utf-8'))yield from writer.drain()while True:line = yield from reader.readline()if line == b'\r\n':breakprint('%s header > %s' % (host, line.decode('utf-8').rstrip()))# Ignore the body, close the socketwriter.close()loop = asyncio.get_event_loop()
tasks = [wget(host) for host in ['www.sina.com.cn', 'www.sohu.com', 'www.163.com']]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

方法三:

在一个web上,一个工程师做了一个探索。发现,当使用aiohtt+asyncio时候是比requests要快很多倍的。所以,推荐使用原装的库。

import aiohttp
import asyncioasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():async with aiohttp.ClientSession() as session:html = await fetch(session, 'http://python.org')print(html)loop = asyncio.get_event_loop()
loop.run_until_complete(main())

aiohttp简单测试

import aiohttp
import asyncio
import time
import requestsasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():async with aiohttp.ClientSession() as session:await fetch(session, 'http://python.org')st = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
et = time.time()
print(et - st)st = time.time()
res_text = requests.get('http://python.org').text
et = time.time()
print(et - st)

输出结果是:

3.109215259552002
2.7337353229522705

目前来看,只爬一个页面的话,其实反而request会快点。

但是当爬取的数目提高的时候就发送了变化了。

import aiohttp
import asyncio
import time
import requestsasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():async with aiohttp.ClientSession() as session:await fetch(session, 'http://python.org')st = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([main(), main()]))
et = time.time()
print(et - st)st = time.time()
res_text = requests.get('http://python.org').text
res_text_2 = requests.get('http://python.org').text
et = time.time()
print(et - st)

输出:

3.1400091648101807
5.478497505187988

当然啦,这是因为第一个其实是采用是协程技术,所以,差别有点大也是可以理解的。

所以,我们要接着探究。

对比 gevent和aiohttp

这个非常有意思,因为两者都是关于协程的,关于随者更优对比一下就可以知道结果了。

文件结构:
三个文件放在同一个目录下:

  • main_Test.py
  • asyncio_Test.py
  • gevent_Test.py

main_Test.py

import asyncio_Test
import gevent_Test
import matplotlib.pyplot as pltasyncio_list = []
gevent_list = []N = 50
Begin = 1
url = 'http://www.python.org'
for i in range(N):asyncio_list.append(asyncio_Test.f(Begin + i, url))gevent_list.append(gevent_Test.f(Begin + i, url))plt.plot(asyncio_list, label='asyncio')
plt.plot(gevent_list, label='gevent')plt.legend()
plt.savefig('1.png')
plt.show()

asyncio_Test.py

import aiohttp
import asyncio
import timeasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main(Target_url):async with aiohttp.ClientSession() as session:await fetch(session, Target_url)def f(Times, Target_url):st = time.time()loop = asyncio.get_event_loop()task = [main(Target_url)] * Timesloop.run_until_complete(asyncio.wait(task))et = time.time()return et - st

gevent_Test.py

import gevent
from gevent import monkey
import time
import requests
monkey.patch_socket()def request_f(Target_url):res_text = requests.get(Target_url).textdef f(Times, Target_url):st = time.time()WaitList = [gevent.spawn(request_f, Target_url)] * Timesgevent.joinall(WaitList)et = time.time()return et - st

对比效果如下:

可以发现,当只爬取一个网页的时候,其实,反而用gevent+request会更快。
随着每次爬取的网页是数目的累积,只有当爬取的数目接近20个的时候,asyncio才普遍低于gevent(虽然也是基本接近)。

相差只有0.01秒左右(我直接把数值输出来过)

会接着更新这个。。

asyncio简单入门(二)相关推荐

  1. mysql触发器的简单入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 第一篇链接 https://my.oschina.net/aijiaoer0624/blog/1529475 先贴上代码: C ...

  2. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  3. Vue简单入门及使用(二)---基本语法及组件使用

    Vue简单入门及使用(二)---基本语法及组件使用 Vue文件解读 基本语法 Vue组件使用 前言:做一个有梦想的程序猿! Vue文件解读 以HelloWorld.vue文件为例 一个vue文件里面包 ...

  4. ArtCAM入门简单教程(二)——浮雕

    记录过去,奋斗现在,展望未来 (给未来即将结束的工作的'存档') ArtCAM入门简单教程 二.浮雕 前言:这不是个很专业的浮雕设计教程,不过是很简单即可实现的入门教程,而更深入的浮雕学习建议查找更全 ...

  5. 有限元方法入门:有限元方法简单的二维算例(三角形剖分)

    有限元方法简单的二维算例(三角形剖分) 文章目录 有限元方法简单的二维算例(三角形剖分) 算例描述 变分问题 有限元离散 问题转化 有限元三要素 参考单元与一般单元 一般单元上的形函数 一般单元上的积 ...

  6. 有限元方法入门:有限元方法简单的二维算例(矩形剖分)

    #有限元方法简单的二维算例(矩形剖分) 算例描述 我们对下述椭圆边值问题 \label{eq1}{−Δu=fu∣∂Ω=0\left \{ \begin{aligned} & -\Delta u ...

  7. 系列文章--oracle简单入门教程

    oracle入门很简单:八.oracle数据表 1.创建oracle数据表创建oracle数据表的语法如下: create table命令用于创建一个oracle数据表:括号内列出了数据表应当包含的列 ...

  8. 【我的区块链之路】- Hyperledger fabric的简单入门(四)链码的编写及调试

    [我的区块链之路]- Hyperledger fabric的简单入门(四)链码的编写及调试       之前的文章中我们有讲过了fabric的一些核心的配置文件的选项说明,讲过fabric 的网络启动 ...

  9. SQL基础使用入门(二): DML语句和DCL语句

    SQL语句第二个类别--DML 语句 DML是数据操作语言的缩写,主要用来对数据表中数据记录实例对象进行操作,包括插入.删除.查找以及修改四大操作,这也是开发人员使用中最为频繁的操作. 1.插入记录 ...

最新文章

  1. python--windows下安装BeautifulSoup
  2. java基础知识总结,绝对经典
  3. qt ui界面加入qsplitter_UI 文件设计与运行机制
  4. ActiveMQ的集群与高可用
  5. 窗口捕获显示黑屏_win10每次重启黑屏假死
  6. gis中开始编辑之后显示空间参考_空间参考—帮助 | ArcGIS Desktop
  7. 罗海雄:仅仅使用AWR做报告? 性能优化还未入门(含PPT)
  8. JS组件系列——两种bootstrap multiselect组件大比拼
  9. 一个人开长途车旅游安全吗?
  10. 解决wordpress后台管理访问速度慢的问题
  11. 西安高铁“洋班组” 助力新春运
  12. cadence软件下载linux,Red Hat Linux 9.0下安装Cadence IC5.0
  13. 华为笔试题库及性格测试
  14. Webstorm2018破解
  15. web安全day19:DNS欺骗、ARP攻击及钓鱼网站制作
  16. 用python计算工资工资_php项目中用python来预测薪资(工资)
  17. java 空格变成问号_【转】空格变成问号的怪问题
  18. S32K144调试记录(二)
  19. 【SolidWorks】模型状态显示设置介绍
  20. ion-slides 图片只能滑动一半、图片索引错误导致图片显示错误(缓存问题导致的)

热门文章

  1. TS2003基于触摸屏的应用
  2. LeetCode.917-只反转字母(Reverse Only Letters)
  3. X86嵌入式主板在IOT网关产品的应用
  4. 总结一下嵌入式OLED显示屏显示中文汉字的办法
  5. yii框架相关知识(转)
  6. dtree.js树的使用
  7. python_5.fit()函数,transform()函数,与fit_transform()函数
  8. 【Python学习系列八】Python实现线性可分SVM(支持向量机)
  9. Hive查询结果输出文件
  10. 最长公共子序列Java代码实现