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所有窗口并输出窗口标题的方法
Mar 13 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
python语言中with as的用法使用详解
Feb 23 Python
python矩阵转换为一维数组的实例
Jun 05 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
Jun 11 Python
解决PyCharm import torch包失败的问题
Oct 13 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
解决Pycharm 运行后没有输出的问题
Feb 05 Python
Python内置数据类型中的集合详解
Mar 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中mysql模块部分功能的简单封装
2011/09/30 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
详解JavaScript函数
2015/12/01 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
vue2里面ref的具体使用方法
2017/10/27 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
小程序实现分类页
2019/07/12 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
Python数据类型详解(一)字符串
2016/05/08 Python
python实现泊松图像融合
2018/07/26 Python
python 实现绘制整齐的表格
2019/11/18 Python
wxPython实现画图板
2020/08/27 Python
Python如何输出整数
2020/06/07 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
物流专业毕业生推荐信范文
2013/11/18 职场文书
年会主持词结束语
2014/03/27 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python