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实现在windows下操作word的方法
Apr 28 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
Python之循环结构
Jan 15 Python
浅谈python的深浅拷贝以及fromkeys的用法
Mar 08 Python
pycharm配置git(图文教程)
Aug 16 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
Python3实现将一维数组按标准长度分隔为二维数组
Nov 29 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
Python max函数中key的用法及原理解析
Jun 26 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
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
python原始套接字编程示例分享
2014/02/21 Python
wxPython事件驱动实例详解
2014/09/28 Python
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
使用Python求解最大公约数的实现方法
2015/08/20 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
基于python实现百度翻译功能
2019/05/09 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
python使用建议与技巧分享(一)
2020/08/17 Python
Python urllib3软件包的使用说明
2020/11/18 Python
台湾最大网路书店:博客来
2018/03/18 全球购物
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
外贸销售员求职的自我评价
2013/11/23 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
公安交警个人对照检查材料思想汇报
2014/10/01 职场文书
杜甫草堂导游词
2015/02/03 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android