官方文档:
为什么看这个
在看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‘)}")
asyncio简介
原文:https://www.cnblogs.com/ximixuexi/p/13138547.html