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

使用asyncio/aiohttp在Windows10虚拟机中遇信号量超时错误求助

解决aiohttp虚拟机中“信号量超时时间已过期”连接错误

首先明确:错误提示里的“信号量超时”是系统网络栈层面的提示,和你代码里的asyncio.Semaphore完全无关,本质是网络连接建立失败导致的超时,结合你的场景,大概率和虚拟机的代理、防火墙配置有关,下面是具体分析和解决步骤:

核心可能原因及排查方案

1. 代理配置未正确同步到aiohttp

虚拟机系统配置了代理,但aiohttp默认不会自动读取系统代理设置,导致请求走不通:

  • 先验证系统代理是否生效:用虚拟机里的浏览器打开目标站点,确认能正常访问
  • 手动给aiohttp配置代理,修改你的ClientSession初始化代码:
    import aiohttp
    
    async def fetch_data():
        # 替换成你虚拟机的代理地址和端口
        proxy = "http://your-proxy-ip:proxy-port"
        # 如果代理需要账号密码,格式是 http://username:password@proxy-ip:port
        async with aiohttp.ClientSession(proxy=proxy) as session:
            async with session.get("https://your-target-url") as resp:
                print(resp.status)
    

2. 虚拟机防火墙拦截了请求

物理机的防火墙允许程序出站,但虚拟机的防火墙(Windows Defender或企业内网防火墙)可能限制了Python程序的网络访问:

  • 打开虚拟机的「Windows Defender防火墙」→「允许应用通过防火墙」,找到你的Python程序(如果是虚拟环境,要选虚拟环境里的python.exe),勾选对应的网络类型(专用/公用,根据虚拟机的网络配置)
  • 用PowerShell测试端口连通性:Test-NetConnection 目标主机域名 -Port 443,如果返回tcpTestSucceeded为False,说明端口被拦截,联系IT确认虚拟机的网络策略

3. DNS解析或SSL证书问题

  • DNS解析异常:在虚拟机命令行执行nslookup 目标主机域名,对比物理机的解析结果,若不一致,修改虚拟机的DNS服务器地址(比如改成和物理机一致的公共DNS)
  • SSL证书问题:虚拟机缺少目标站点的CA证书,导致SSL握手失败触发超时,可临时关闭SSL验证调试(仅用于排查,生产环境不要用):
    async def fetch_data():
        connector = aiohttp.TCPConnector(ssl=False)
        async with aiohttp.ClientSession(connector=connector) as session:
            async with session.get("https://your-target-url") as resp:
                print(resp.status)
    
    如果关闭验证后能正常连接,说明需要给虚拟机导入对应的CA证书

快速调试步骤

  1. 先用浏览器/命令行确认虚拟机能访问目标站点的443端口
  2. 给aiohttp手动配置代理后测试
  3. 排查防火墙和SSL/DNS问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:09:58