asyncio简介

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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')}")。

相关文档
最新文档