Вопрос

Для начала я использовал Twisted и SocketServer с ForkMixIn и ThreadMixIn и попробовал рецепты «пула потоков».

Однако мне хотелось заставить что-то работать на Python.

Маленький фон.Ранее я написал на C простой TCP-демон, который привязывался к сокету и прослушивал его, затем много раз предварительно разветвлял X, а затем просто передавал описание серверного сокета всем развилкам, и все принимали клиентов очень-очень дружно.

Я проверил асинкор на основе «выбор/опрос», который мне очень нравится.Моя единственная претензия заключалась в том, что я мог немного освободить процессор, сделав несколько раз ветвление, чтобы воспользоваться преимуществами многопроцессорной машины и надеяться на лучшее с планированием.

Я не могу заставить это работать всю жизнь.Только один экземпляр может принимать соединения, все остальные просто выдают исключение при обработке соединения: «невозможно выполнить итерацию через Empty».

это вообще осуществимо?Я много проверял, но не смог найти НИ ОДНОГО кода для разветвления асинхронных диспетчеров (cry)

Спасибо!

Обновление 1:(Полная отслеживание по запросу)

error: uncaptured python exception, closing channel <__main__.EchoServer listening 0.0.0.0:8001 at 0x2ad4880c93f8> (<type 'exceptions.TypeError'>:'NoneType' /python2.6/asyncore.py|readwrite|99] [/usr/local/python2.6.9/lib/python2.6/asyncore.py|handle_read_event|408] [./6py-server.py|handle_accept|87])

Всегда происходит при принятии, независимо от того, делаю ли я разветвление перед asyncore.loop и т. д.

Обновление 2:(полный исходный код) пастебинированный источник

Это было полезно?

Решение

Вам следует использовать разметку кода для обратной трассировки, иначе он будет отображаться беспорядочно, и мы не увидим тип исключения.

Но я верю, что это TypeError: 'NoneType' object is not iterable с self.accept() могу вернуться None.Причина в том, что несколько процессов могут получить событие чтения для прослушиваемого сокета, но только один может его принять.Остальные процессы получат EWOULDBLOCK ошибка, которая перехватывается, но затем возвращается None вместо пары адрес подключения.

Измените свой handle_accept() вернуться немедленно, когда accept() возвращает None.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top