让我损失了三小时的异步输入输出错误

发布日期:2026-05-01 10:33:55   浏览量 :0
发布日期:2026-05-01 10:33:55  
0

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

这件事发生在去年,当时我正在为我们的内部运营平台添加一个“批量域名存活检测”功能。需求很简单:定期轮询 1000 多个域名,检查超文本传输协议状态码,如果任何域名在 5 秒内没有响应,则将其标记为宕机。我心想——这显然是一个输入/输出密集型任务。用异步输入输出库来拯救局面吧,它应该在几分钟内完成。于是我加入了一堆async defawaitgather操作,满怀信心地运行了代码……结果如何?1000 个域名花费了超过四分钟——几乎与同步顺序请求没有区别。我盯着屏幕,感觉被派森语言 personally 戏弄了。

在接下来的三个小时里,我对异步输入输出库的理解被彻底拆解并重建。如果你曾经在一个异步函数中“意外”阻塞了事件循环,或者在没有意识到的情况下在gather中丢失了异常,那么这段实战经历应该能为你节省超过三个小时的时间。

1. 复现问题:看似并发,实则不然

这是我最初编写的“并发”代码(看看你能否发现问题):

import asyncio
import time
import requests

async def check_domain(url: str) -> dict:
    """检测单个域名的状态码和耗时"""
    start = time.monotonic()
    try:
        # 注意这里用的是 requests,同步库
        resp = requests.get(url, timeout=5, allow_redirects=True)
        status = resp.status_code
    except Exception as e:
        status = str(e)
    elapsed = time.monotonic() - start
    return {"url": url, "status": status, "elapsed": elapsed}

async def main

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部