Python asyncore: "filedescriptor вне диапазона в select ()" - PullRequest
1 голос
/ 03 ноября 2011

У меня есть некоторый скрипт на python с более чем 3k исходящих соединений сокетов, основанный на asyncore lib.Я не могу использовать select (..) из-за ограничения соединений (1024), но poll (..) тоже не работает должным образом:

asyncore.loop(use_poll=True)

При этом вызове мое приложение игнорирует любые события сокетов.Обратите внимание, что select () на менее чем 1024 сокетах работает нормально.

Где моя проблема?

1 Ответ

0 голосов
/ 06 декабря 2011

Сначала небольшая коррекция. use_poll=True не заставляет asyncore использовать epoll (2) . Это заставляет его использовать poll (2) (более того, так как работает асинхронный режим, нет особых оснований пытаться использовать epoll (2) , поскольку накладные расходы на уровне Python для асинхронного режима) перевешивает любые расходы на используемый API-интерфейс уведомления о событиях сокета).

Во-вторых, основным недостатком asyncore является степень, в которой он подвергает вас специфическим особенностям платформы. Для библиотеки, которая обрабатывает больше различий между , выберите (2) и poll (2) для вас, и которая фактически поддерживает epoll (2) , и что лучше и по ряду других способов , посмотрите Twisted .

Если вы можете добавить больше деталей к вашему вопросу, возможно, конкретная проблема, с которой вы столкнулись при асинхронном обращении, может быть обнаружена, но, основываясь на информации, доступной сейчас, невозможно быть уверенным. Основные функции поддержки asyncore poll (2) работают - т.е. она может доставлять уведомления о чтении, записи и закрытии в тривиальном случае. Чем ваш случай отличается от тривиального?

...