Python, Asyncore и вилки

Просто для начала я использовал Twisted и SocketServer с обоими ForkMixIn, ThreadMixIn и попробовал рецепты "пула потоков".

Тем не менее, я хотел сделать что-то особенное в Python.

Немного фона. Ранее я писал на C простой демон TCP, который связывался с сокетом и прослушивал его, затем много раз делал предварительную ветвь X, а затем просто передавал дескриптор serversocket всем вилкам, и все очень и очень охотно принимали бы клиентов.

Я проверил асинкоры на основе "выбор / опрос", которые мне очень нравятся. Единственное, что я могу сказать, так это то, что я смог немного ослабить нагрузку на процессор, разогнувшись несколько раз, чтобы воспользоваться преимуществами машины с несколькими процессорами и надеяться на лучшее при планировании.

Я не могу заставить это работать на всю жизнь. Только 1 единственный экземпляр может принимать соединения, все остальные просто выдают исключение при обработке соединения, "не может проходить через пустой".

это вообще возможно? Я проверил много, но я не мог найти ЛЮБОЙ код для разветвления асинхронных диспетчеров (крик)

Спасибо!

Обновление 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])

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам