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_exceptions 为False
(默认),所引发的首个异常会立即传播给等待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 型数值表示的等待秒数。如果 timeout 为None
,则等待直到完成。
如果发生超时,任务将取消并引发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 指定此函数应在何时返回。它必须为以下常数之一:
与wait_for()
不同,wait()
在超时发生时不会取消可等待对象