python 标准库学习笔记《五》

asyncio

version 3.7.0

可等待对象

携程

函数以async修饰,
调用需在函数名前加await,直接调用并不会运行,

async def nested():
    return 42

任务

任务创建传入的函数必须以async修饰
任务创建方式 asyncio.create_task(func())
调用需在任务名前加await,直接调用并不会运行,

async def nested():
    return 42
task = asyncio.create_task(nested())

Futures

Future 是一种特殊的 低层级 可等待对象,表示一个异步操作的 最终结果。
当一个 Future 对象 被等待,这意味着协程将保持等待直到该 Future 对象在其他地方操作完毕。
在 asyncio 中需要 Future 对象以便允许通过 async/await 使用基于回调的代码。
通常情况下 没有必要 在应用层级的代码中创建 Future 对象。
Future 对象有时会由库和某些 asyncio API 暴露给用户,用作可等待对象:

函数介绍

asynic.run((coroutine, *, debug=False))

执行coroutine并返回结果
当有其他asynico事件循环在同一线程中运行时,此函数不能被调用
如果Debug为True 事件将以调试模式运行

asyncio.create_task(coroutine)

返回一个Task对象

coroutine asyncio.sleep(delay, result=None, *, loop=None)

休眠

awaitable asyncio.gather(*aws, loop=None, return_exceptions=False)

并发 运行 aws序列中的 [可等待对象]。
如果 aws中的某个可等待对象为协程,它将自动作为一个任务加入日程。
如果所有可等待对象都成功完成,结果将是一个由所有返回值聚合而成的列表。结果值的顺序与 aws 中可等待对象的顺序一致。
如果 return_exceptionsFalse (默认),所引发的首个异常会立即传播给等待 gather() 的任务。aws 序列中的其他可等待对象 不会被取消 并将继续运行。
如果 return_exceptions 为 True,异常会和成功的结果一样处理,并聚合至结果列表。
如果 gather() 被取消,所有被提交 (尚未完成) 的可等待对象也会 被取消。

awaitable asyncio.shield(aw, *, loop=None)

保护一个 [可等待对象]
如果 aw 是一个协程,它将自动作为任务加入日程。

coroutine asyncio.wait_for(aw, timeout, *, loop=None)

等待 aw 可等待对象 完成,指定 timeout 秒数后超时。
如果 aw 是一个协程,它将自动作为任务加入日程。
timeout 可以为 None,也可以为 float 或 int 型数值表示的等待秒数。如果 timeoutNone,则等待直到完成。
如果发生超时,任务将取消并引发 asyncio.TimeoutError.
要避免任务 取消,可以加上 shield()
函数将等待直到目标对象确实被取消,所以总等待时间可能超过 timeout 指定的秒数。
如果等待被取消,则 aw 指定的对象也会被取消。

coroutine asyncio.wait(aws, *, loop=None, timeout=None, return_when=ALL_COMPLETED)

并发运行 aws 指定的 可等待对象 并阻塞线程直到满足 return_when 指定的条件。
如果 aws 中的某个可等待对象为协程,它将自动作为任务加入日程。直接向 wait() 传入协程对象已弃用,因为这会导致 令人迷惑的行为
返回两个 Task/Future 集合: (done, pending)

done, pending = await asyncio.wait(aws)

如指定 timeout (float 或 int 类型) 则它将被用于控制返回之前等待的最长秒数。
请注意此函数不会引发 asyncio.TimeoutError。当超时发生时,未完成的 Future 或 Task 将在指定秒数后被返回。
return_when 指定此函数应在何时返回。它必须为以下常数之一:

image.png

wait_for()不同,wait() 在超时发生时不会取消可等待对象

asyncio.as_completed(aws, *, loop=None, timeout=None)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容