1 回答
TA贡献1852条经验 获得超1个赞
经过进一步调查,此问题似乎不是由aiohttp
/直接引起的,asyncio
而是由以下两者引起的限制/限制:
DNS 服务器的容量/速率限制
系统级别的最大打开文件数。
首先,对于那些希望获得一些增强的 DNS 服务器的人(我可能不会走那条路),大名鼎鼎的选择似乎是:
1.1.1.1 (Cloudflare)
8.8.8.8(谷歌公共 DNS)
亚马逊 53 号公路
(对于像我这样缺乏网络概念的人来说,很好地介绍了 DNS。)
我做的第一件事是在增强的 AWS EC2 实例上运行上述内容 - h1.16xlarge 运行 IO 优化的 Ubuntu。我不能说这本身有帮助,但它肯定不会伤害。我对 EC2 实例使用的默认 DNS 服务器不太熟悉,但是在复制上述脚本时,上面带有 errno == 8 的 OSError 消失了。
然而,它出现了一个新的异常,OSError 代码为 24,“打开的文件太多”。我的修补程序解决方案(不认为这是最可持续或最安全的)是增加最大文件限制。我是通过以下方式做到的:
sudo vim /etc/security/limits.conf
# Add these lines
root soft nofile 100000
root hard nofile 100000
ubuntu soft nofile 100000
ubuntu hard nofile 100000
sudo vim /etc/sysctl.conf
# Add this line
fs.file-max = 2097152
sudo sysctl -p
sudo vim /etc/pam.d/commmon_session
# Add this line
session required pam_limits.so
sudo reboot
诚然,我在黑暗中感觉周围,但将其与asyncio.Semaphore(1024)(此处的示例)相结合导致上述两个异常中的 0 个被引发:
# Then call this from bulk_get with asyncio.Sempahore(n)
async def bounded_get(sem, url, session) -> str:
async with sem:
return await get(url, session)
在大约 25k 个输入 URL 中,只有大约 100 个 GET 请求返回异常,主要是由于这些网站被合法破坏,完成的总时间在几分钟内,我认为可以接受。
添加回答
举报