出现 EAGAIN 或 EWOULDBLOCK 错误后是否应继续轮询套接字以检查其是否已准备就绪?

出现 EAGAIN 或 EWOULDBLOCK 错误后是否应继续轮询套接字以检查其是否已准备就绪?

我正在使用 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 操作将阻塞的情况。

相关内容