Назад | Перейти на главную страницу

Следует ли продолжать опрос сокета на предмет готовности после ошибки EAGAIN или EWOULDBLOCK?

Я создаю веб-сканер с мультиплексным менеджером загрузок с использованием Linux epoll (Linux 2.6.30.x). Я выбираю ссылки из базы данных, содержащей более 40 000 доменов (каждый домен имеет от 1 до 2000 URL-адресов), всего 250 000 URL-адресов. Я мультиплексирую загрузки так, чтобы в среднем у меня было не более 2 параллельных потоков на хост (в соответствии с рекомендацией спецификации HTTP), а также для того, чтобы переключаться между пакетами из 10-50 хостов за раз. Я выбрал неблокирующие сокеты и epoll из-за скорости и масштабируемости (у меня мало ОЗУ) и простоты использования по сравнению с опросом, выбором и вводом-выводом, управляемым сигналом.

Я загружаю первые несколько сотен URL-адресов очень плавно и быстро. Проблема в том, что я продолжаю получать ошибку EAGAIN / EWOULDBLOCK из определенных ссылок (сокетов), которые в противном случае кажутся готовыми (т.е. я могу использовать браузер своего ПК, чтобы открывать ссылки в любой момент). Но даже после того, как они неоднократно ожидали смены статуса на EPOLLIN, они остаются EAGAIN / EWOULDBLOCK. Эти ссылки накапливаются очень быстро, так что мне приходится останавливать всю загрузку.

Что на самом деле означает EAGAIN / EWOULDBLOCK? Является ли EAGAIN / EWOULDBLOCK постоянным статусом, так что после обнаружения я должен исключить этот сокет из любого дальнейшего наблюдения?

Пожалуйста, помогите.

Эта ссылка показывает значение кодов ошибок в библиотеке GNU. EAGAIN/EWOULDBLOCK означает, что ресурсы временно недоступны. Звонок может сработать, если вы попробуете позже. Примером является случай неблокирующей операции ввода-вывода, которая будет заблокирована.