![出现 EAGAIN 或 EWOULDBLOCK 错误后是否应继续轮询套接字以检查其是否已准备就绪?](https://linux22.com/image/580647/%E5%87%BA%E7%8E%B0%20EAGAIN%20%E6%88%96%20EWOULDBLOCK%20%E9%94%99%E8%AF%AF%E5%90%8E%E6%98%AF%E5%90%A6%E5%BA%94%E7%BB%A7%E7%BB%AD%E8%BD%AE%E8%AF%A2%E5%A5%97%E6%8E%A5%E5%AD%97%E4%BB%A5%E6%A3%80%E6%9F%A5%E5%85%B6%E6%98%AF%E5%90%A6%E5%B7%B2%E5%87%86%E5%A4%87%E5%B0%B1%E7%BB%AA%EF%BC%9F.png)
我正在使用 Linux epoll (Linux 2.6.30.x) 创建带有多路复用下载管理器的网络爬虫。我从包含 40,000 多个域(每个域有 1 到 2000 个 URL)的数据库中选取链接,总共 250,000 个 URL。我对下载进行多路复用,这样平均每个主机的并行流不超过 2 个(根据 HTTP 规范建议),并且每次在 10 到 50 个主机之间循环。与轮询、选择和信号驱动的 I/O 相比,我选择了非阻塞套接字和 epoll,因为它们速度快、可扩展性好(RAM 不足),而且易于使用。
我非常顺利、快速地下载了前几百个 URL。问题是,我不断从某些看似已准备就绪的链接(套接字)收到 EAGAIN/EWOULDBLOCK 错误(即我可以使用 PC 的浏览器随时打开链接)。但即使在反复对它们进行 epolling 并期望它们的状态变为 EPOLLIN 后,它们仍然是 EAGAIN/EWOULDBLOCK。这些链接建立得非常快,所以我不得不停止整个下载。
EAGAIN/EWOULDBLOCK 到底是什么意思?EAGAIN/EWOULDBLOCK 是否是永久状态,因此一旦检测到,我应该将该套接字从任何进一步的观察中删除?
请帮忙。
答案1
此链接显示 GNU 库中的错误代码的含义。EAGAIN/EWOULDBLOCK
表示资源暂时不可用。如果您稍后再试,该调用可能会成功。一个例子是非阻塞 IO 操作将阻塞的情况。