У меня есть скрипт python с более чем 3k исходящими соединениями сокетов, основанный на asyncore lib. Я не могу использовать select (..) из-за ограничений соединений (1024), но опрос (..) тоже не работает должным образом:
asyncore.loop(use_poll=True)
При этом вызове мое приложение игнорирует любые события сокета. Обратите внимание, что select() на менее чем 1024 сокетах работает нормально.
Где моя проблема?
Во-первых, незначительная коррекция. use_poll=True
не вызывает asyncore
для использования epoll (2). Это заставляет его использовать опрос (2) (более того, как работает asyncore, нет смысла пытаться использовать epoll (2), потому что накладные расходы на уровне Python asyncore перегружают любую стоимость используемого API уведомления о событиях сокета),
Во-вторых, основным недостатком asyncore
является то, насколько он предоставляет вам специфические особенности платформы. Для библиотеки, которая обрабатывает больше различий между select (2) и poll (2) для вас и которая на самом деле поддерживает epoll (2), и которая лучше подходит для многих других способов, проверьте Twisted.
Если вы можете добавить более подробную информацию к своему вопросу, возможно, конкретная проблема, с которой вы сталкиваетесь в asyncore, может быть обнаружена, но на основе имеющейся информации теперь нет способа быть уверенным. Самые основные функции поддержки asyncore poll (2) действительно работают, т.е. Могут передавать сообщения чтения, записи и закрытия в тривиальный случай. Как ваше дело отличается от тривиального случая?