我读过很多关于 asyncio
/ async
/ await
在 Python 3.5+ 中的问题/答案,我发现很多都是复杂的大概是 这个。
它仍然使用 ensure_future
,为了学习 Python 中的异步编程,我希望看到一个更小的示例,以及执行基本异步/等待示例 所需的最少工具是 什么。
问题:是否可以举一个 简单的例子来说明 async
/ await
是如何工作 的,只使用这两个关键字 + 运行异步循环的代码 + 其他 Python 代码而不是其他 asyncio
函数?
示例:像这样:
import asyncio
async def async_foo():
print("async_foo started")
await asyncio.sleep(5)
print("async_foo done")
async def main():
asyncio.ensure_future(async_foo()) # fire and forget async_foo()
print('Do some actions 1')
await asyncio.sleep(5)
print('Do some actions 2')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
但没有 ensure_future
,并且仍然演示 await / async 的工作原理。
原文由 Basj 发布,翻译遵循 CC BY-SA 4.0 许可协议
为了回答您的问题,我将针对同一问题提供 3 种不同的解决方案。
案例 1:只是普通的 Python
输出:
案例 2:async/await 做错了
输出:
案例 3:async/await 正确完成
与情况 2 相同,除了
sleep
函数:输出:
案例 1 和案例 2 给出相同的 5 秒,而案例 3 仅 3 秒。所以 async/await 正确完成 会更快。
差异的原因在于
sleep
函数的实现。在情况 1 和情况 2 中,它们是“相同的”:它们在不允许其他人使用资源的情况下“休眠”。而在情况 3 中,它允许在睡眠时访问资源。
在案例 2 中,我们将
async
添加到正常函数中。然而,事件循环将 不间断 地运行它。为什么?因为我们没有说循环在哪里允许中断你的函数来运行另一个任务。在案例 3 中,我们告诉事件循环在何处中断函数以运行另一个任务。具体在哪里?就在这儿!
更多信息请阅读 这里
2020 年 5 月 2 日更新
考虑阅读