异步io的优势

传统web应用的一大缺点是,遇到io只能阻塞,等待处理完后再返回,在此期间,无法处理其他的请求。严重降低了系统的并发能力。而异步io则应用而生,本文将从协程、asyncio、aiohttp这三个方面介绍异步io的使用。

协程协程和线程的区别

协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CPU进行顺序分时使用。任务执行顺序用户可控。线程,多线程共享进程中的资源,通过全局GIL锁来平均分配CPU,在不同线程中不断切换执行任务,任务执行顺序用户不能控制。

asyncio

asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。不仅有可以用作后端异步编程aiohttp,也可在爬虫中发挥出异步的优势的asyncio,甚至可以比Scrapy还要快,这种神器,其实也并不难理解。从Python 3.5开始引入了新的语法async和await,让协程的代码更简洁易读。基本用法如下:

import asyncioasync def hello():print("Hello world!") r = await asyncio.sleep(1) print("Hello again!")# 获取EventLoop:loop = asyncio.get_event_loop()# 执行coroutineloop.run_until_complete(hello())loop.close()

使用步骤:1.利用async关键字定义协程,利用await做异步io切换2.获取eventloop3.执行协程,等待所有协程执行完毕

线程和协程执行效率PK

这里我们测试1000个协程和线程执行时间耗时(模拟io时间为1s),代码如下:

from threading import Threadimport timeimport asyncioasync def hello():r = await asyncio.sleep(1)

pre_time = time.time()

loop = asyncio.get_event_loop()

tasks = [hello() for x in range(1000)

loop.run_until_complete(asyncio.wait(tasks))

loop.close()print('1000个协程耗时:', time.time() - pre_time, 's')def hello():time.sleep(1)pre_time = time.time()threads = [Thread(target=hello) for x in range(1000)]for x in threads: x.start()for x in threads: x.join()print('1000个线程耗时', time.time() - pre_time, 's')

打印结果如下:

1000个协程耗时: 1.0314579010009766 s1000个线程耗时 1.1242129802703857 s

显然,协程效率大于线程,若继续增大任务数目到10000呢?打印显示:

10000个协程耗时: 1.2555210590362549 s_start_new_thread(self._bootstrap, ())RuntimeError: can't start new thread

可以看出,多个协程切换时间依旧很小,而线程由于数目太多已经挂了,在这种io高并发场景中,协程完胜。

aiohttp

和asyncio的区别是:asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。在python中其他知名的异步io框架还有:Tornado:异步非阻塞IO的Python Web框架,最新版本的异步协程是基于Python内置的asyncio来实现(老版本用装饰器实现异步)Pulsar:Python的事件驱动并发框架Diesel:基于Greenlet的事件I/O框架安装:

pip install aiohttp

基本使用如下:

import asynciofrom aiohttp import webasync def index(request):await asyncio.sleep(0.5) return web.Response(body=b'

Index

')async def hello(request): await asyncio.sleep(0.5) text = '

hello, %s!

' % request.match_info['name'] return web.Response(body=text.encode('utf-8'))async def init(loop): app = web.Application(loop=loop) app.router.add_route('GET', '/', index) app.router.add_route('GET', '/hello/{name}', hello) srv = await loop.create_server(app.make_handler(), '127.0.0.1', 8000) print('Server started at http://127.0.0.1:8000……') return srvloop = asyncio.get_event_loop()loop.run_until_complete(init(loop))loop.run_forever()

官方建议部署方式为:nginx+supervisor,此种部署方式性能最佳具体使用可以参考官方文档:https://github.com/aio-libs/aiohttp

python asyncio_Python中asyncio神器的入门相关推荐

  1. python asyncio_python中asyncio模块

    asyncio 是干什么的? 异步网络操作 并发 协程 python3.0 时代,标准库里的异步网络模块:select(非常底层) python3.0时代,第三方异步网络库:Tornado pytho ...

  2. python asyncio_Python 中的异步编程:Asyncio

    异步和同步的代码对比 现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了sleep方法外,其余部分完全相同.在第一个脚本里,我会用标准的 time.sleep 方法, ...

  3. Python 协程 asyncio 极简入门与爬虫实战

    在了解了 Python 并发编程的多线程和多进程之后,我们来了解一下基于 asyncio 的异步IO编程--协程 01 协程简介 协程(Coroutine)又称微线程.纤程,协程不是进程或线程,其执行 ...

  4. python asyncio_Python之asyncio模块的使用

    asyncio模块作用:构建协程并发应用的工具 python并发的三大内置模块,简单认识: 1.multiprocessing:多进程并发处理2.threading模块:多线程并发处理3.asynci ...

  5. python类中数据成员_Python 入门 之 类成员

    1.类的私有成员 私有: 只能自己拥有 以 __ 开头就是私有内容 对于每一个类的成员而言都有两种形式: - 公有成员,在任何地方都能访问 - 私有成员,只有在类的内部才能使用 私有成员和公有成员的访 ...

  6. python游戏中调整箭头下落速度_入门 | 三行Python代码,让数据预处理速度提高2到6倍...

    原标题:入门 | 三行Python代码,让数据预处理速度提高2到6倍 选自TowardsDataScience 作者:George Seif,机器之心编译 在 Python 中,我们可以找到原生的并行 ...

  7. python中pandas是指什么_Python中的神器Pandas,但是有人说Pandas慢...

    原标题:Python中的神器Pandas,但是有人说Pandas慢... 如果你从事大数据工作,用Python的Pandas库时会发现很多惊喜.Pandas在数据科学和分析领域扮演越来越重要的角色,尤 ...

  8. Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习

    Python 基础 之 jupyter notebook 中机器学习的简单入门书写数字识别 demo 操作学习 目录 Python 基础 之 jupyter notebook 中机器学习的简单入门书写 ...

  9. python类中的属性分为类属性和实例属性两种_python从入门到大神---1、初始化实例、类属性、方法...

    python从入门到大神---1.初始化实例.类属性.方法 一.总结 一句话总结: 方法不加括号是代码段:感觉python方法和js,php很类似,不加括号是代码段,加括号变成方法,比如f,f() 1 ...

最新文章

  1. 15 年工龄的资深技术专家职场历程自述
  2. 如何配置LCD背光和LED,调试方法
  3. Boring data structure problem 模拟-双端队列
  4. SAP API开发方法大全
  5. [css] 检测sass中错误的指令是哪个?
  6. sharding分表后主键_Sharding-JDBC 使用入门和基本配置
  7. Mysql8.0Mysql5.7Mysql5.6Mysql5.5特性对比
  8. 【将图像字符画】【第二玩】图像字符化
  9. 从零开始学keras之过拟合与欠拟合
  10. Problem C: 默认参数:求圆面积
  11. SqlServer的分割函数
  12. extjs 不显示 但是不报错
  13. python官网的软件-python
  14. android开发学习笔记系列(6)--代码规范
  15. 更换系统后无法catkin_make universal robot 包
  16. 开发Google Material Design风格的WPF程序
  17. python函数的使用
  18. SpringMVC Ⅰ
  19. 不用代码趣讲 ZooKeeper 集群
  20. matlab 奈 线,用MATLAB绘制Nyquist图

热门文章

  1. 从0搭建一个用户成长体系,你需要知道的都在这了
  2. 20155235 信息安全技术概论 第二次实验报告
  3. 设计模式之——bridge模式
  4. input 限制输入
  5. springmvc5源码
  6. 学习笔记(01):Oracle数据库-Oracle安装与配置
  7. Programmer,Developer,Engineer——软件从业人员的职业规划
  8. File upload error - unable to create a temporary file in bUnknown/b on line
  9. qutebrowser 只用键盘操作的浏览器
  10. 使用maven根据JSON文件自动生成Java POJO类(Java Bean)源文件