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
,