python - 如果你等待一个本身没有等待的协程会发生什么?(异步)
问题描述
我试图了解 python 的 asyncio 是如何实现的,并且有一种特殊情况让我感到困惑。如果您等待一个除了名称之外只是一个普通例程的协程会发生什么?
IE:
async def A():
time.wait( 1 )
async def B():
await A()
这会像正常的同步程序一样运行,因此异步和等待是多余的吗?还是将 A() 拆分为一个单独的线程以与其他等待的函数同步运行?
解决方案
正如 python_user 所说,它只是一个线程,asyncio 在单个事件循环中多路复用函数。为了使其工作缓慢(IO 密集但不是CPU 密集型),函数必须将执行控制权交还给事件循环,等待执行此操作。注意 time.wait() 不存在,使用 time.sleep() 或可等待的 asyncio.sleep()。
import asyncio
import time
async def A():
time.sleep(1.0) # blocks, stops B() if called first
async def B():
await asyncio.sleep(1.0) # hands back execution, A() can run while timing
async def main():
t0 = time.time()
await asyncio.gather(A(), B()) # takes 2 seconds
print(time.time() - t0)
t0 = time.time()
await asyncio.gather(B(), A()) # takes 1 second
print(time.time() - t0)
if __name__ == '__main__':
asyncio.run(main())
推荐阅读
- javascript - 谷歌分析 cookie 在 chrome>=80 模式下被拒绝(SameSite=None;Secure;pair enabled)
- javascript - 我想在 heroku 上托管我的不和谐机器人,我做的一切都是正确的,但是当我做 git push heroku 时,我在日志中出现错误
- javascript - 邀请命令问题 (discord.js)
- c# - 如何在 C# / Entity Framework 的 NotMapped 属性的设置器中使用映射属性
- c# - C# WPF GMap.NET Z 索引
- c++ - 获取当前密钥状态?
- c++ - N-ary Tree Level Traversal bug (C++)
- bash - Echo 不带缩进?
- c# - 如何获取外部 ASP.Net Web 应用程序的运行时调用堆栈?
- flutter - 最大化和最小化颤振桌面应用程序出现黑屏