asyncio简介
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
asyncio简介
官⽅⽂档:
为什么看这个
在看websockets的时候,发现不知道⾥⾯的async关键字是啥,为什么的函数调不到。
就翻了翻官⽅⽂档看⼀下。
asyncio是python3.4中加⼊的,⼀种新的书写协程的⽅式。
它也⽀持旧式的基于⽣成器的协程,即基于yield的协程。
再来回顾⼀下协程的概念:我理解的协程,就是同⼀个线程内的完全基于程序调⽤的,可以返回值,中途挂起,再回到执⾏处的程序。
跟线程⽐较,优势就是少了上下⽂切换,更轻量级。
另⼀个主要原因还是因为python的全局锁,让python的多线程⽐较鸡肋,协程优势就更⼤了。
本⽂中,主要将了和协程相关的⼀些知识。
以下是asyncio中的主要概念:
可等待对象:
可以在await中使⽤的对象,为可等待对象。
可等待对象主要有三种:协和,任务,Future
协程
可等待对象,因此可以在其他协程中被等待。
协程函数:async def定义的函数
协和对象:调⽤协程函数返回的对象。
asyncio也⽀持旧式的基于⽣成器的协程。
任务
⽤于进⾏并发
当⼀个协程通过asyncio.create_task等函数打包为⼀个任务,该协程将⾃动排⼊⽇程准备⽴即运⾏。
在调⽤await时,执⾏。
Futures
Future是⼀种特殊的低层级可等待对象,表⽰⼀个异步操作的最终结果。
当⼀个Future对象被等待,表⽰协程将保持等待直到该Future对象在其他地⽅操作完毕。
通常没必要在应⽤层级代码中创建Future对象
这个等到学的时候再来仔细看吧。
感觉官⽅⽂档上讲得挺好的。
⼀般Futures⽤在三⽅库中,如websockets的源码中就⽤到了。
应⽤层⽤得少。
常⽤函数
运⾏
运⾏⼀个可等待对象:
asyncio.run(func) #这⾥的func是协程函数
并发运⾏
awaitable asyncio.gather(*aws, loop=None, return_exceptions=False)
创建任务
task = asyncio.create_task(coro())
休眠
coroutine asyncio.sleep(delay, result=None, *)
delay: 阻塞秒数
result: 如果指定,则当协程完成时将其返回给调⽤者。
协程中的休眠。
总是挂起当前任务,以允许其他任务运⾏。
屏蔽取消操作
保护⼀个可等操作,防⽌其被取消。
超时
指定等待await的超时的时间
简单⽰例
1、简单的可等待对象调⽤
两个await并⾮并发执⾏的。
import asyncio
import time
async def say_after(delay, what):
await asyncio.sleep(delay)
print(what)
async def main():
print(f"started at {time.strftime('%X')}")
await say_after(1, 'hello')
await say_after(2, 'world')
print(f"finished at {time.strftime('%X')}")
asyncio.run(main())
2、使⽤task来进⾏并发执⾏
把⽰例1中的main⽅法改⼀下就可以了。
async def main():
task1 = asyncio.create_task(
say_after(1, 'hello'))
task2 = asyncio.create_task(
say_after(2, 'world'))
print(f"started at {time.strftime('%X')}")
# Wait until both tasks are completed (should take
# around 2 seconds.)
await task1
await task2
print(f"finished at {time.strftime('%X')}")。