You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何asyncio.Semaphore使用async with as语法会输出None?

问题解答

核心原因

asyncio.Semaphore 可以使用 async with as 语法,但它的异步上下文管理器的__aenter__方法返回None,这就是函数b中打印sem为None的根本原因。

具体分析

  1. 函数a的执行逻辑
    你提前创建了Semaphore实例并赋值给变量sem,async with sem仅负责获取信号量、进入上下文,打印的是你之前创建的sem实例本身,因此能输出信号量对象的信息。

  2. 函数b的执行逻辑
    async with asyncio.Semaphore(2) as sem中,as绑定的是Semaphore.__aenter__()方法的返回值。在Python 3.9的asyncio.Semaphore实现里,__aenter__仅完成信号量的获取操作,返回值为None,所以变量sem被赋值为None,打印自然输出None。

验证与补充

你可以通过简单测试验证这一点:

import asyncio

async def test():
    sem = asyncio.Semaphore(2)
    # 直接调用__aenter__方法查看返回值
    result = await sem.__aenter__()
    print(result)  # 输出: None
    await sem.__aexit__(None, None, None)

asyncio.run(test())

如果需要在async with上下文内使用信号量实例,建议提前创建对象,就像函数a的写法一样。

内容的提问来源于stack exchange,提问作者baby195lxl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:55:01