python中使用asyncio实现异步IO实例分析


Posted in Python onFebruary 26, 2021

1、说明

Python实现异步IO非常简单,asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。

2、实例

import asyncio
@asyncio.coroutine
def wget(host):
  print('wget %s...' % host)
  connect = asyncio.open_connection(host, 80)
  reader, writer = yield from connect
  header = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % host
  writer.write(header.encode('utf-8'))
  yield from writer.drain()
  while True:
    line = yield from reader.readline()
    if line == b'\r\n':
      break
    print('%s header > %s' % (host, line.decode('utf-8').rstrip()))
  # Ignore the body, close the socket
  writer.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()

知识点扩展:

数据流(Streams)

数据流(Streams)是用于处理网络连接的高阶异步/等待就绪(async/await-ready)原语,可以在不使用回调和底层传输协议的情况下发送和接收数据。

以下是一个用asyncio实现的TCP回显客户端:

import asyncio

async def tcp_echo_client(message):
  reader, writer = await asyncio.open_connection(
    '127.0.0.1', 8888)

  print(f'Send: {message!r}')
  writer.write(message.encode())

  data = await reader.read(100)
  print(f'Received: {data.decode()!r}')

  print('Close the connection')
  writer.close()
  await writer.wait_closed()

asyncio.run(tcp_echo_client('Hello World!'))

到此这篇关于python中使用asyncio实现异步IO实例分析的文章就介绍到这了,更多相关python中使用asyncio实现异步IO内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
让python在hadoop上跑起来
Jan 27 Python
python中enumerate函数遍历元素用法分析
Mar 11 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
对python numpy.array插入一行或一列的方法详解
Jan 29 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
Python自定义聚合函数merge与transform区别详解
May 26 Python
详解Python函数print用法
Jun 18 Python
浅析Python模块之间的相互引用问题
Feb 26 #Python
python实现学生通讯录管理系统
Feb 25 #Python
基于Pytorch版yolov5的滑块验证码破解思路详解
Feb 25 #Python
python实现不同数据库间数据同步功能
Feb 25 #Python
使用python实现学生信息管理系统
Feb 25 #Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 #Python
使用tkinter实现三子棋游戏
Feb 25 #Python
You might like
php入门教程 精简版
2009/12/13 PHP
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
php实例化一个类的具体方法
2019/09/19 PHP
Javascript 学习笔记 错误处理
2009/07/30 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python读写文件方法总结
2015/06/09 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
Django中url的反向查询的方法
2018/03/14 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
python面向对象法实现图书管理系统
2019/04/19 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
pandas DataFrame运算的实现
2020/06/14 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
北京天润融通.net面试题笔试题
2012/02/20 面试题
与UNIX有关的几个名词
2015/09/17 面试题
中班幼儿评语大全
2014/04/30 职场文书
贷款担保申请书
2014/05/20 职场文书
婚纱店策划方案
2014/05/22 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers