python之asyncio
asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。
asnycio是用来编写并发代码的库,python3.5以后使用async/await语法。
asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。
asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。
asyncio 提供一组 高层级 API 用于:
- 并发地 运行 Python 协程 并对其执行过程实现完全控制;
- 执行 网络 IO 和 IPC;
- 控制 子进程;
- 通过 队列 实现分布式任务;
- 同步 并发代码;
此外,还有一些 低层级 API 以支持 库和框架的开发者 实现:
- 创建和管理 事件循环,以提供异步 API 用于
网络化, 运行子进程,处理OS 信号等等; - 使用 transports 实现高效率协议;
- 通过 async/await 语法 桥接 基于回调的库和代码。
利用asyncio实现hello world协程
python3.4
import asyncio @asyncio.coroutine
def hello():
print("Hello!---")
# 异步调用asyncio.sleep(1):
r = yield from asyncio.sleep(1)
print("---World!") # 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()
@asyncio.coroutine会把一个generator(生成器)标记为coroutine(协程)类型,然后我们就把这个coroutine扔到eventloop(事件循环)中去。
hello()首先会打印出'Hello!----',然后yeild from语法可以让我们更方便的调用另一个generator。由于asyncio.sleep(1)也是一个coroutine,所有线程不会等待asyncio,.sleep(1),而是直接中断并执行下一个消息循环了。当asyncio返回时,线程就可以从yield from拿到返回值(此处是None)并执行下一句语句。
把asyncio看作是一个耗时1s的I/O操作,在此期间主线程并未等待,而是去执行event_loop中其他可以执行的coroutine了,因此可以实现并发执行。
python 3.5
用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异步操作。
为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法async和await,可以让coroutine的代码更简洁易读。
请注意,async和await是针对coroutine的新语法,要使用新的语法,只需要做两步简单的替换:
- 把
@asyncio.coroutine替换为async; - 把
yield from替换为await。
那么上述代码可以简化为:
import asyncio async def hello():
print("Hello!---")
# 异步调用asyncio.sleep(1):
await asyncio.sleep(1)
print("---World!") # 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()
python 3.7
新增了asyncio.run() api来执行异步函数
上述代码可以改为:
import asyncio async def hello():
print("Hello!---")
# 异步调用asyncio.sleep(1):
await asyncio.sleep(1)
print("---World!") asyncio.run(hello())
python之asyncio的更多相关文章
- 我实在不懂Python的Asyncio
原语 事件循环(Event Loop) Awaitables和Coroutines Coroutine Wrappers Awaitables and Futures Tasks Handles Ex ...
- python:利用asyncio进行快速抓取
web数据抓取是一个经常在python的讨论中出现的主题.有很多方法可以用来进行web数据抓取,然而其中好像并没有一个最好的办法.有一些如scrapy这样十分成熟的框架,更多的则是像mechanize ...
- Python 和 Asyncio 编写在线多人游戏(一)
在技术和文化领域,大规模多人在线游戏(MMO)毋庸置疑是我们当今世界的潮流之一.很长时间以来,写一个 MMO 游戏这件事总是会涉及到大量的预算与复杂的底层编程技术.不过在最近这几年,事情迅速发生了变化 ...
- [Python 多线程] asyncio (十六)
asyncio 该模块是3.4版本加入的新功能. 先来看一个例子: def a(): for x in range(3): print('a.x', x) def b(): for x in 'abc ...
- Python:asyncio模块学习
python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...
- Python使用asyncio+aiohttp异步爬取猫眼电影专业版
asyncio是从pytohn3.4开始添加到标准库中的一个强大的异步并发库,可以很好地解决python中高并发的问题,入门学习可以参考官方文档 并发访问能极大的提高爬虫的性能,但是requests访 ...
- python:Asyncio模块处理“事件循环”中的异步进程和并发执行任务
python模块Asynico提供了管理事件.携程.任务和线程的功能已经编写并发代码的同步原语. 组成模块: 事件循,Asyncio 每个进程都有一个事件循环. 协程,子例程概念的泛化,可以暂停任务, ...
- Python之asyncio模块的使用
asyncio模块作用:构建协程并发应用的工具 python并发的三大内置模块,简单认识: .multiprocessing:多进程并发处理 .threading模块:多线程并发处理 .asyncio ...
- python之asyncio三种应用方法
1.直接使用asyncio.run方法2.同步的效果,用await调用函数3.创建任务(asyncio.create_task),并发运行任务(await asyncio.gather) import ...
随机推荐
- 【aardio】回车换行符
回车换行符 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字 ...
- 2019新版UI设计面试题汇总(附答案)
问题一.Android手机的常用设计尺寸有_________.怎么适配ios和安卓. 答案:安卓320 X 480是常规模拟器.但现在的开发都是用360x640做一倍率.480 X 800(1.5倍率 ...
- MySQL数据库和表名大小写敏感开关的打开办法
背景:window 10系统安装了MySQL57,使用可视化操作工具Navicat Premium 12进行相关操作,一切比较顺利.但在建立数据库和表时,发现大小写命名不敏感.区分大小写输入,保存后默 ...
- Finance财务软件(科目标签专题)
为了满足不同业务需求,对凭证中增加一些扩展内容,我们采用自定义科目标签的形式. 怎样自定义标签? 1. 增加科目掩码 这里的代码需要与模板表中tagLabel对应 这里的名称中对应掩码值,为16位整型 ...
- c语言01次作业--分支,顺序结构
C语言--第01次作业 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 本章学习让我体会良多.首先,不得不承认自己是一个非常马虎的人.常见的问题就是输出格式上常因为没有与题目要 ...
- squid代理加用户认证
squid代理加用户认证 用authentication helpers添加身份验证 有如下几种认证方式 :=> NCSA: Uses an NCSA-style username and pa ...
- Web3D
https://baike.baidu.com/item/WEB%203D/11066359?fr=aladdin https://zhidao.baidu.com/question/17325151 ...
- Codeforces 888 简要题解
文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 A题 传送门 题意简述:给一个数列,问有多少个峰值点(同时比两边都大/小的点) 思路:按照题意模拟. 代码: #include<bit ...
- CentOS7配置阿里云源
cd /etc/yum.repos.d/ mkdir backup mv CentOS-* backup/ wget -O /etc/yum.repos.d/CentOS-Base.repo http ...
- C# 获取外网IP地址
很多情况下我们需要获取外网的IP地址,一般用自带的方法获取到的都是不准确,往往获取到的是内网的IP地址,所以需要采用外部网站接口来获取. 代码 通过访问第三方接口来获取真实的ip地址 public s ...