异步IO:当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理

异步IO模型需要一个消息循环,在消息循环中,主线程不断重复“读取消息-处理消息”这个过程
在一个消息模型中,处理一个消息必须非常迅速,否则,主线程将无法及时处理消息队列中的其他消息,导致程序看上去停止响应
在异步IO模型中,一个线程可以同时处理多个IO请求,并且没有切换线程的操作,对于大多数IO密集型的应用程序,使用异步IO将大大提升系统的多任务处理能力

协程

协程,又称微线程,协程看上去也是子程序,但执行过程中,在子程序内部可以中断,然后转而执行别的子程序,在适当的时候再返回来接着执行

基于协程的生产者-消费者模型
1、首先,调用send(None)启动生成器
2、然后,一旦生产了商品,通过send(n)切换到consumer消费
3、consumer通过yield拿到消息,处理消息,又通过yield把结果传回
4、producer拿到consumer处理的结果,继续生产,产生下一条消息
5、producer决定停止生产后,通过close关闭consumer,整个过程结束

"""
生产者——消费者模型(协程)
"""def consumer():r = ''while True:n = yield rif not n:returnprint('[Consumer] Consuming %s' % n)r = '200 OK'def producer(c):c.send(None)n = 0while n < 5:n += 1print('[Producer] Producing %s' % n)r = c.send(n)print('[Producer] Consumer return: %s' % r)c.close()cc = consumer()
producer(cc)
[Producer] Producing 1
[Consumer] Consuming 1
[Producer] Consumer return: 200 OK
[Producer] Producing 2
[Consumer] Consuming 2
[Producer] Consumer return: 200 OK
[Producer] Producing 3
[Consumer] Consuming 3
[Producer] Consumer return: 200 OK
[Producer] Producing 4
[Consumer] Consuming 4
[Producer] Consumer return: 200 OK
[Producer] Producing 5
[Consumer] Consuming 5
[Producer] Consumer return: 200 OKProcess finished with exit code 0

asyncio

asyncio是一个标准库,直接内置了对异步IO的支持

用asyncio实现HelloWorld

"""
用asyncio实现Hello World
"""
import asyncio@asyncio.coroutine
def hello():print('Hello World!')# 异步调用asyncio.sleepyield from asyncio.sleep(1)print('Hello again!')# 获取EventLoop
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()
Hello World!
Hello again!Process finished with exit code 0

用asyncio的异步网络连接来获取请求的header

"""
用asyncio的异步网络连接来获取请求的header
"""
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()))writer.close()loop = asyncio.get_event_loop()
tasks = [wget(host) for host in ['www.baidu.com', 'www.jd.com', 'www.qq.com', 'www.taobao.com']]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
wget www.qq.com...
wget www.baidu.com...
wget www.taobao.com...
wget www.jd.com...
www.qq.com header > HTTP/1.1 302 Moved Temporarily
www.qq.com header > Server: stgw/1.3.12.4_1.13.5
www.qq.com header > Date: Fri, 31 Jul 2020 08:08:14 GMT
www.qq.com header > Content-Type: text/html
www.qq.com header > Content-Length: 169
www.qq.com header > Connection: close
www.qq.com header > Location: https://www.qq.com/
www.baidu.com header > HTTP/1.0 200 OK
www.baidu.com header > Accept-Ranges: bytes
www.baidu.com header > Cache-Control: no-cache
www.baidu.com header > Content-Length: 14615
www.baidu.com header > Content-Type: text/html
www.baidu.com header > Date: Fri, 31 Jul 2020 08:08:14 GMT
www.baidu.com header > P3p: CP=" OTI DSP COR IVA OUR IND COM "
www.baidu.com header > P3p: CP=" OTI DSP COR IVA OUR IND COM "
www.baidu.com header > Pragma: no-cache
www.baidu.com header > Server: BWS/1.1
www.baidu.com header > Set-Cookie: BAIDUID=B5A4DF1D527248708FAA5CA3FFE230F9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
www.baidu.com header > Set-Cookie: BIDUPSID=B5A4DF1D527248708FAA5CA3FFE230F9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
www.baidu.com header > Set-Cookie: PSTM=1596182894; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
www.baidu.com header > Set-Cookie: BAIDUID=B5A4DF1D52724870C8528BC85E29577C:FG=1; max-age=31536000; expires=Sat, 31-Jul-21 08:08:14 GMT; domain=.baidu.com; path=/; version=1; comment=bd
www.baidu.com header > Traceid: 159618289405573632109291624733192979223
www.baidu.com header > Vary: Accept-Encoding
www.baidu.com header > X-Ua-Compatible: IE=Edge,chrome=1
www.taobao.com header > HTTP/1.1 301 Moved Permanently
www.taobao.com header > Server: Tengine
www.taobao.com header > Date: Fri, 31 Jul 2020 08:08:14 GMT
www.taobao.com header > Content-Type: text/html
www.taobao.com header > Content-Length: 278
www.taobao.com header > Connection: close
www.taobao.com header > Location: https://www.taobao.com/
www.taobao.com header > Via: cache4.cn806[,0]
www.taobao.com header > Timing-Allow-Origin: *
www.taobao.com header > EagleId: 968a619815961828940813509e
www.jd.com header > HTTP/1.1 302 Moved Temporarily
www.jd.com header > Server: nginx
www.jd.com header > Date: Fri, 31 Jul 2020 08:08:14 GMT
www.jd.com header > Content-Type: text/html
www.jd.com header > Content-Length: 138
www.jd.com header > Connection: close
www.jd.com header > Location: https://www.jd.com/
www.jd.com header > Access-Control-Allow-Origin: *
www.jd.com header > Timing-Allow-Origin: *
www.jd.com header > X-Trace: 302-1596182894095-0-0-0-0-0
www.jd.com header > Strict-Transport-Security: max-age=360Process finished with exit code 0

为了更好的标识异步IO,我们可以使用async/await来替换@asyncio.coroutine和yield from
修改后的代码如下:

"""
用asyncio的异步网络连接来获取请求的header
"""
import asyncioasync def wget(host):print('wget %s ...' % host)connect = asyncio.open_connection(host, 80)reader, writer = await connectheader = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % hostwriter.write(header.encode('utf-8'))await writer.drain()while True:line = await reader.readline()if line == b'\r\n':breakprint('%s header > %s' % (host, line.decode('utf-8').rstrip()))writer.close()loop = asyncio.get_event_loop()
tasks = [wget(host) for host in ['www.qq.com', 'www.baidu.com', 'www.taobao.com']]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

蒟蒻写博客不易,加之本人水平有限,写作仓促,错误和不足之处在所难免,谨请读者和各位大佬们批评指正。
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:虐猫人薛定谔
博客地址:https://blog.csdn.net/Deep___Learning

【Python复习巩固 Day10】异步IO相关推荐

  1. Python学习笔记:异步IO(3)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  2. Python学习笔记:异步IO(2)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. python rq asyncio_Python 的异步 IO:Asyncio 简介

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 异步 IO,就是你发起一个 IO 操作,不用等它结束,可以继续做其他事情,当它结束时,你会得到通知. Asyncio 是并 ...

  4. aiohttp 高并发web服务_【Python入门】50.异步IO之 asyncio实现异步操作

    摘要:如何通过asyncio实现异步IO:用aiohttp模块编写支持多用户高并发的服务器. *写在前面:为了更好的学习python,博主记录下自己的学习路程.本学习笔记基于廖雪峰的Python教程, ...

  5. Python学习笔记:异步IO(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. python进程\协程\异步IO

    进程 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! Python ...

  7. python异步和进程_12.python进程\协程\异步IO

    进程 Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了 multiprocessing模块中提供了Process , Queue , P ...

  8. python asyncio tcp server_asyncio异步IO——Streams详解

    前言 本文翻译自python3.7官方文档--asyncio-stream,译者马鸣谦,邮箱 1612557569@qq.com.转载请注明出处. 数据流(Streams) 数据流(Streams)是 ...

  9. Python 高级编程和异步IO并发编程 --12_7 生成器进阶- yield from

    # Python 3.3新加了yield from语法 from itertools import chain # chain可以将迭代的类型给连接起来,直接做一个for循环 my_list = [1 ...

最新文章

  1. 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)
  2. 《深度学习的数学》二刷总结
  3. 微服务架构与Spring Cloud Alibaba
  4. WinForm 数据库无限填充树目录 treeView
  5. 聚类算法(part1)--DBSCAN
  6. 解析poj页面获取题目
  7. 【sampleDateFormat】对日期进行解析
  8. 配置Pylint for Python3.5
  9. 解析几何 | 吕子根 设三平行平面 $\pi_i:\ Ax+By+Cz+D_i=0\,(i=1,2,3),L,M,N$ 依次是平面 $\pi_1,\pi_2,\pi_3$ 上的任意点,求 $\tria
  10. 丁腈橡胶自然老化时间_氙灯老化试验箱和紫外光老化试验箱的区别
  11. 苹果笔记本显卡性能测试软件,苹果Mac Pro性能测试:好厉害的“垃圾桶”
  12. php 显示英文日期,DEDECMS怎么显示英文日期时间
  13. 为什么RSA 公钥指数(e=65537)
  14. java短视频开发技术_看Java学员如何用前后端分离技术搭建短视频健身APP
  15. 英语词源基础之后缀-ion详解: -ion,-tion,-ction,-ption,-ation,-ition的区别
  16. uni-app云打包失败
  17. python 针对二分类问题画roc曲线
  18. 游戏中的人工智能AI设计
  19. pdf2swf用法和一些不能解决问题
  20. Android开发者编写自己的API接口(上)

热门文章

  1. 微信小程序 拨打电话简单实现
  2. vue cli 3项目打包到指定目录
  3. Word之输出音符mf中强音符(三)
  4. 探索人工智能音乐的未来:从算法到文化
  5. 搭建网站/APP最全准备攻略
  6. 分类模型的评价指标及实现(Python)
  7. Logistic回归与Softmax回归
  8. 上海擎标助力联通(江苏)产业互联网有限公司荣获ISO22301业务连续性体系认证
  9. 初高中数学物理学习方法
  10. windows下jenkins运行jar包的命令