Featured image of post Python asyncio协程 - 简单等待(一)

Python asyncio协程 - 简单等待(一)

asyncio协程 - 简单等待

语法如下

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

官方文档简介如下

并发运行 aws 指定的 可等待对象 并阻塞线程直到满足 return_when 指定的条件。

返回两个 Task/Future 集合: (done, pending)

用法如下

1
done, pending = await asyncio.wait(aws)

如指定 timeout (float 或 int 类型) 则它将被用于控制返回之前等待的最长秒数。

请注意此函数不会引发 asyncio.TimeoutError。当超时发生时,未完成的 Future 或 Task 将在指定秒数后被返回。

return_when 指定此函数应在何时返回。它必须为以下常数之一:

常数描述
FIRST_COMPLETED函数将在任意可等待对象结束或取消时返回。
FIRST_EXCEPTION函数将在任意可等待对象因引发异常而结束时返回。当没有引发任何异常时它就相当于 ALL_COMPLETED
ALL_COMPLETED函数将在所有可等待对象结束或取消时返回。

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

注意

wait() 会自动将协程作为任务加入日程,以后将以 (done, pending) 集合形式返回显式创建的任务对象。因此以下代码并不会有预期的行为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import asyncio

async def num():
    return 42

async def main():

    coro = num()
    done, pending = await asyncio.wait({coro})

    if coro in done:
        # 这里将不会运行
        print(coro)

asyncio.run(main())

上面的代码将不会运行

如果将上面的代码修改为下面的代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import asyncio

async def num():
    return 42

async def main():

    coro = asyncio.create_task(num())
    done, pending = await asyncio.wait({coro})

    if coro in done:
        # 这里将不会运行
        print(coro)

asyncio.run(main())

上面的代码运行结果类似如下

1
2
$ python main.py
<Task finished coro=<num() done, defined at main.py:14> result=42>
Licensed under CC BY-NC-SA 4.0
最后更新于 Jul 30, 2025 11:04 +0800