请求网页

方法一:

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. Java正则表达式--Matcher.group函数的用法
  2. Caffe实战二(手写体识别例程:CPU、GPU、cuDNN速度对比)
  3. CodeForces - 1417F Graph and Queries(克鲁斯卡尔重构树的dfs序上建线段树)
  4. 一所传闻要被“降级”的211高校,让这位网红教授“救活了”
  5. 前端学习(1333):mongodb增
  6. 开源商务智能软件Pentaho
  7. python boolean_如何在Python中使用boolean’和’
  8. android 使用外部字体
  9. 20行 Python 代码爬取王者荣耀全英雄皮肤 | 原力计划
  10. yum或apt基本源设置指南
  11. PKU 1062 昂贵的聘礼
  12. python 文本分析教程_《Python机器学习基础教程》七、处理文本数据
  13. dcs常用的冗余方式_DCS系统冗余技术讲解
  14. Laravel SQL查询中first, pluck与lists方法
  15. python输出希腊字母
  16. Infrastructure 知识: dnf对module的处理
  17. C++设计模式——状态模式
  18. 打印票据--java
  19. TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步
  20. 商标“李鬼”防不胜防,事关宁德时代

热门文章

  1. 当汇错款时该怎么办?
  2. Wince6 RIL层移植
  3. 手机通过WIFI连上ZXV10 H618B路由器但不能上网问题的解决
  4. S3C6410的SPI控制器
  5. IBM发表论文:可能已找到处理量子计算退相干的方法
  6. AWS CSAA -- 04 AWS Object Storage and CDN - S3 Glacier and CloudFront(三)
  7. redis与spring的完全集成
  8. ZABBIX3.0配置邮件报警
  9. 算法时间复杂度和空间复杂度表示
  10. 广播系统android安全:flag FLAG_RECEIVER_REGISTERED_ONLY的意义