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中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
python支持多线程的爬虫实例
Dec 21 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
python 递归调用返回None的问题及解决方法
Mar 16 Python
python3读取autocad图形文件.py实例
Jun 05 Python
对Python 字典元素进行删除的方法
Jul 31 Python
Django filter动态过滤与排序实现过程解析
Nov 26 Python
python 检测图片是否有马赛克
Dec 01 Python
PyTorch中clone()、detach()及相关扩展详解
Dec 09 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 Python
python实现简单反弹球游戏
Apr 12 Python
pytorch损失反向传播后梯度为none的问题
May 12 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
ThinkPHP3.1.3版本新特性概述
2014/06/19 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
vue多次循环操作示例
2019/02/08 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
原生JS实现天气预报
2020/06/16 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
PyCharm在win10的64位系统安装实例
2017/11/26 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
浅谈Python中(&,|)和(and,or)之间的区别
2019/08/07 Python
python与mysql数据库交互的实现
2020/01/06 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
秘书岗位职责
2013/11/18 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
客房服务员岗位职责
2015/02/09 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书