Python, Asyncore и вилки - PullRequest
       20

Python, Asyncore и вилки

2 голосов
/ 11 ноября 2009

Просто для начала я использовал 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 Ответ

2 голосов
/ 11 ноября 2009

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

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

Измените handle_accept() на немедленный возврат, когда accept() вернет None.

...