首页 > 解决方案 > 如果你等待一个本身没有等待的协程会发生什么?(异步)

问题描述

我试图了解 python 的 asyncio 是如何实现的,并且有一种特殊情况让我感到困惑。如果您等待一个除了名称之外只是一个普通例程的协程会发生什么?

IE:

async def A():
    time.wait( 1 )

async def B():
    await A()

这会像正常的同步程序一样运行,因此异步和等待是多余的吗?还是将 A() 拆分为一个单独的线程以与其他等待的函数同步运行?

标签: pythonasynchronous

解决方案


正如 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())

推荐阅读